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语句:
- 先确保已安装
dblink扩展(用于跨库查询):
CREATE EXTENSION IF NOT EXISTS dblink;
- 执行以下查询获取批量创建脚本:
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;
- 复制查询结果中的所有
create_function_sql语句并执行,即可批量生成对应远程函数的本地包装器。
注意事项
- 以上示例基于
postgres_fdw,其他类型的FDW(如mysql_fdw)语法可能略有不同,需根据实际情况调整。 - 确保本地数据库用户拥有远程函数的执行权限,以及FDW服务器的访问权限。
- 包装函数的参数类型、数量和返回类型必须与远程函数完全一致,否则会导致调用失败。
内容的提问来源于stack exchange,提问作者mistermims
相关产品推荐
相关产品推荐

