【问题标题】:Creating Procedures with Transactions using PGAdmin 4使用 PGAdmin 4 创建带有事务的过程
【发布时间】:2019-09-20 04:54:26
【问题描述】:

我来自 SQL Server 的悠久历史并尝试学习 PL/PGSQL。我最近发现了 PG11 功能 CREATE PROCEDURE,它允许在其体内进行内部事务。

作为学习练习,我创建了这个:

DROP PROCEDURE IF EXISTS test_proc();
CREATE PROCEDURE test_proc()
       LANGUAGE plpgsql
AS $$
  BEGIN
    DROP TABLE IF EXISTS a;
    CREATE TABLE a (aid int);
    COMMIT;
  END;
$$;

call test_proc();

它在 PSQL 中运行良好,但是当我在 PGAdmin 4 的查询工具中执行它时,它会出错

错误:无效的交易终止

上下文:PL/pgSQL 函数 test_proc() 在 COMMIT 的第 5 行

SQL 状态:2D000

有人可以解释发生了什么吗?我猜 PROCEDURE 实际上是有效的,问题可能出在查询工具中,可能错误地处理了包含的 COMMIT。

对于解决这个问题有什么建议吗?

谢谢!

【问题讨论】:

  • 您执行的查询会导致错误
  • 嗨。我正在执行上面发布的一组查询。
  • 您是否先创建了存储过程,然后在创建时出现错误
  • 没错。创建过程时失败。如果我删除提交(我认为在其中有效),它会起作用。
  • 用函数替换关键字 PROCEDURE

标签: pgadmin-4


【解决方案1】:

在 Pgadmin CREATE PROCEDURE as FUNCTION 请通过将 PROCEDURE 替换为 Function 并添加 Return 类型来尝试此操作,它会起作用

DROP FUNCTION  IF EXISTS test_proc();
CREATE FUNCTION  test_proc()
RETURNS VOID 
LANGUAGE plpgsql

AS $$
  BEGIN
    DROP TABLE IF EXISTS a;
    CREATE TABLE a (aid int);
    COMMIT;
  END;
$$;

【讨论】:

  • 谢谢哈克什。在这种情况下,我尝试使用一个过程,因为我希望能够创建多个事务。这是一个很好的概述。 cybertec-postgresql.com/en/…我知道这是我给出的一个人为的例子,但这只是作为一个学习练习。
  • 如果您认为这是您正在寻找的东西,那么我会建议您不同的解决方案
  • 如果您使用 pgadmin 4.12 并移动,那么您发布的工作不需要更改
  • 我正在使用 pgadmin 4.13 和 Postgres 11.5。该脚本在 PSQL 中有效,在 PGAdmin 中无效。
  • 但我在我的 4.12 中运行相同的是工作正常,没有任何错误
【解决方案2】:

您能否尝试取消选中 pgAdmin4 中的自动提交和自动回滚选项?

您可以在查询工具中的“执行”按钮附近找到下拉菜单。

【讨论】:

  • 谢谢。我确实尝试过。事实上,我尝试了所有组合。我看到了同样的行为。
  • 然后将此问题报告给开发者pgadmin.org/support/list
  • 好主意。谢谢。
  • @DamienSawyer 参考2ndquadrant.com/en/blog/… 它说 CALL 仅在其自身的上下文中有效,所以我认为它是预期的。
猜你喜欢
  • 2018-09-06
  • 1970-01-01
  • 2022-06-29
  • 1970-01-01
  • 2023-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多