PostgreSQL中dynamic dblink创建连接后断开提示不存在如何解决
问题根因
你编写的代码中,perform format('select dblink_connect(''toto'', ''port=%s dbname=%s'')', port, dbname) 仅会生成包含dblink_connect语句的字符串,并不会执行字符串内部的SQL逻辑,因此dblink_connect从未实际运行,不存在名为toto的连接,断开操作自然会报错。
修复方案
将perform format(...)替换为execute语句执行动态生成的SQL即可,完整可运行代码如下:
do $$ declare port int; dbname varchar; begin select current_database() into dbname; select setting into port from pg_catalog.pg_settings where name = 'port'; execute format ('select dblink_connect(''toto'', ''port=%s dbname=%s'')', port, dbname); perform dblink_disconnect('toto'); end $$;
优化建议
可以使用PostgreSQL的美元符引用特性避免多层单引号转义,降低代码出错概率:
do $$ declare port int; dbname varchar; begin select current_database() into dbname; select setting into port from pg_catalog.pg_settings where name = 'port'; execute format( $sql$ select dblink_connect('toto', 'port=%s dbname=%s') $sql$, port, dbname ); perform dblink_disconnect('toto'); end $$;
如果运行仍报错,可先执行以下语句确认dblink扩展已安装:CREATE EXTENSION IF NOT EXISTS dblink;
内容的提问来源于stack exchange,提问作者MattRgx
相关产品推荐
相关产品推荐

