我有一个很长的 PLPGSQL 函数,它可以做几件事,其中之一是创建一个外部服务器和外部表来联系来自另一个数据库的表并在其中插入行。为此,我有一个看起来像这样的函数:
-- Creates the foreign server and the foreign tables
CREATE OR REPLACE FUNCTION create_foreign_ds() RETURNS void AS $$
BEGIN
IF NOT EXISTS (SELECT * FROM pg_foreign_server WHERE srvname = 'myserv') THEN
CREATE SERVER myserv
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host 'localhost',
dbname 'db',
port '5432');
CREATE USER MAPPING FOR current_user SERVER myserv;
PERFORM create_ds_foreign_table('table1');
PERFORM create_ds_foreign_table('table2');
PERFORM create_ds_foreign_table('table3');
RAISE NOTICE 'Foreign tables created.';
ELSE
RAISE NOTICE 'Foreign server already existed';
END IF;
END;
$$ LANGUAGE PLPGSQL;
当我直接调用这个函数时,一切都很好。但是当我在我的主函数中执行此操作时,它什么也不做(未创建外部服务器和外部表),并且该函数后来因此崩溃。奇怪的是函数中的通知被打印出来了,所以代码正在执行但它没有创建我的服务器。