【问题标题】:Postgres dblink stored procedure call with specifying transaction level具有指定事务级别的 Postgres dblink 存储过程调用
【发布时间】:2015-02-03 12:37:11
【问题描述】:

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

【问题讨论】:

  • 你是否连接了另一端的另一个 PostgreSQL 服务器?
  • @pozs 请参阅更新 1

标签: postgresql plpgsql dblink


【解决方案1】:

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

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

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

简而言之,你需要执行:

-- 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');

【讨论】:

  • @FrozenHeart 没关系(这就是我写你可能不需要事务管理的原因)。正如我所说,您应该将dblink() 用于SELECT 语句。你试过了吗?
  • 感谢瞄准。您的变体失败:ERROR: statement returning results not allowed 但这对我有用(我的 another_stored_procedure() 返回 void):PERFORM * FROM dblink('myconn', 'SELECT another_stored_procedure()') as t1(test text);
  • @FrozenHeart 是的,我忘了returns setof record(如dblink() 返回)总是需要别名,您可以在其中指定列别名/类型。
猜你喜欢
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 2015-02-18
  • 1970-01-01
  • 2021-11-09
  • 2012-11-03
相关资源
最近更新 更多