我想以这种方式在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函数的有用信息。
答案 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');