You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中导入外部模式函数的替代方案咨询

如何通过Foreign Data Wrapper调用远程数据库的函数

默认情况下,IMPORT FOREIGN SCHEMA仅会导入远程模式中的表、视图和序列,不支持导入函数。不过你可以通过以下两种方式实现调用远程函数的需求:

1. 手动创建本地包装函数

如果远程函数数量较少,直接在本地目标模式中创建包装函数,通过FDW引用远程函数即可。以PostgreSQL的postgres_fdw为例:

假设远程服务器foreign_server的foreign_schema下有函数calculate_tax(income numeric, rate numeric)返回numeric,在本地temp_schema创建包装函数:

CREATE OR REPLACE FUNCTION temp_schema.calculate_tax(income numeric, rate numeric)
RETURNS numeric
LANGUAGE sql
AS $$
SELECT foreign_schema.calculate_tax(income, rate) FROM foreign_server;
$$;

之后直接调用SELECT temp_schema.calculate_tax(10000, 0.2);,请求会通过FDW转发到远程服务器执行。

2. 批量生成包装函数脚本

如果需要处理大量远程函数,可以通过查询远程数据库的系统元数据,自动生成本地包装函数的SQL语句:

  1. 先确保已安装dblink扩展(用于跨库查询):
CREATE EXTENSION IF NOT EXISTS dblink;
  1. 执行以下查询获取批量创建脚本:
SELECT 
  format(
    'CREATE OR REPLACE FUNCTION temp_schema.%s(%s) RETURNS %s LANGUAGE sql AS $$ SELECT foreign_schema.%s(%s) FROM foreign_server; $$;',
    proname,
    string_agg(format('%s %s', arg_name, arg_type), ', '),
    ret_type,
    proname,
    string_agg(arg_name, ', ')
  ) AS create_function_sql
FROM (
  SELECT 
    proname,
    unnest(proargnames) AS arg_name,
    unnest(proargtypes::regtype::text) AS arg_type,
    prorettype::regtype::text AS ret_type
  FROM dblink('foreign_server', '
    SELECT proname, proargnames, proargtypes, prorettype 
    FROM pg_proc 
    WHERE pronamespace = (SELECT oid FROM pg_namespace WHERE nspname = ''foreign_schema'')
  ') AS func(proname name, proargnames text[], proargtypes oid[], prorettype oid)
) AS func_details
GROUP BY proname, ret_type;
  1. 复制查询结果中的所有create_function_sql语句并执行,即可批量生成对应远程函数的本地包装器。

注意事项

  • 以上示例基于postgres_fdw,其他类型的FDW(如mysql_fdw)语法可能略有不同,需根据实际情况调整。
  • 确保本地数据库用户拥有远程函数的执行权限,以及FDW服务器的访问权限。
  • 包装函数的参数类型、数量和返回类型必须与远程函数完全一致,否则会导致调用失败。

内容的提问来源于stack exchange,提问作者mistermims

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 07:48:27