我假设 dblink 函数没有回滚,但在下面的用例中是。
总结:Function1 是创建表的 dblink 调用。函数 2 调用函数 1。Function2 被定义为缺少 RETURNS 语句的 RETURNS 文本。在执行时,function2 执行 function1 然后返回 ERROR:Proccess reached end without return。
未创建来自 dblink 的表。有人有解释吗?
功能一:
CREATE OR REPLACE FUNCTION function1 (_user text,_pwd text)
RETURNS text
AS $BODY$
DECLARE
conn_string text;
BEGIN
conn_string := FORMAT('port = 5432 host=%1$s dbname=%2$s user=%3$s password=%4$s','host','db',_user,_mdp);
DROP TABLE IF EXISTS foo;
EXECUTE FORMAT('CREATE TABLE foo AS
(SELECT * FROM dblink(''%1$s'',''SELECT * FROM bar'')
AS t(id int, _text character varying, geom geometry(point)));',conn_string);
RETURN 'foo created';
END;
$BODY$;
功能2:
CREATE OR REPLACE FUNCTION function2(_user text,_pwd text)
RETURNS text
DECLARE
BEGIN
PERFORM function1(_user,_pwd);
END; -- END OF FUNCTION REACHED WITHOUT RETURN
$BODY$;
我知道 function2 不是一个工作函数。我不知道的是 function1(和里面的 dblink)被回滚了,我想知道为什么。
foo
以下语句不会在 dblink 指向的数据库中创建远程表,正如问题似乎暗示的那样,而是最初使用远程数据填充的本地表。在远程执行的是一个简单的
SELECT
. 作为CREATE TABLE
当前事务的一部分在本地执行,如果稍后事务失败,它会回滚。