Postgres dblink存储过程调用,指定事务级别

时间:2015-02-03 12:37:11

标签: postgresql plpgsql dblink

我想以这种方式在PL / pgSQL存储过程中使用dblink:

PERFORM dblink_exec('myconn', 'BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE');
PERFORM dblink_exec('myconn', 'SELECT another_stored_procedure()');
PERFORM dblink_exec('myconn', 'COMMIT');

但我在运行时遇到错误:

ERROR:  statement returning results not allowed
CONTEXT:  SQL statement "SELECT dblink_exec('myconn', 'select another_stored_procedure()')"

因此执行失败,尽管我试图以不同的方式获得所需的结果。

更新1:

我知道postgresql中的存储过程是事务性的。 我使用dblink实现自治事务功能,以便在同一台服务器上使用它。

问题是我服务器上的默认事务级别 是"读取提交"但有时我需要启动另一个级别的交易,例如"可串行"

所以我需要在显式事务级别指定的自治事务中执行存储过程。

据我所知dblink允许这样做,但我找不到任何适用于我的情况的dblink或dblink_exec函数的有用信息。

1 个答案:

答案 0 :(得分:5)

我假设你已经与另一端的另一个PostgreSQL服务器连接。

您需要调用dblink()函数来执行包含结果的语句,而不是dblink_exec()。 (即使你的另一端的函数有returns void - 在这种情况下,你可以通过在NULL中调用该函数来获得一个SELECT。)

此外,可能不需要事务管理:

简而言之,您需要执行:

-- PERFORM dblink_exec('myconn', 'BEGIN ...');
--    if you need explicit transaction management
PERFORM * FROM dblink('myconn', 'SELECT another_stored_procedure()') alias(col text);
-- PERFORM dblink_exec('myconn', 'COMMIT');