【问题标题】:postgresql stored procedure begin commit endpostgresql 存储过程开始提交结束
【发布时间】:2021-10-25 11:59:21
【问题描述】:

我在执行 postgresql 存储过程时实际上很困惑(我从某处了解到以下内容):

create or replace procedure update_dba_trades ()
language plpgsql
as $$
begin
    [CODE BLOCK WITH INSERT DELETE ETC...]
    commit;

end;
$$

为什么我们使用所有的开始、结束和提交?我对postgresql的理解是“end”和“commit”是一样的

begin;
[code block]
end;

代表一个完整的事务(要么全部失败,要么全部成功)。我不需要begin; [code]; commit; end;

但是,我在尝试实现多个独立代码块时遇到了困难。在 PostgreSQL 中,我可以做到

begin;
[code block1]
end;
begin;
[code block2]
end;

即使[代码块2]失败,[代码块1]也可以成功,反之亦然。如果我这样做,

create or replace procedure update_dba_trades ()
language plpgsql
as $$
begin;
[code block1]
end;
begin;
[code block2]
end;
$$

然后有错误。如何实现多个独立的代码块?谢谢!

【问题讨论】:

  • beginend 只是 pl/pgsql 中的块。它们与交易无关。

标签: postgresql


【解决方案1】:

不要将SQL statementsBEGIN(与START TRANSACTION 同义)和END(与COMMIT 同义)与PL/pgSQL 语法元素BEGINEND 混淆。

在 PL/pgSQL 中,代码被排列在 blocks 中,看起来像 like this:

[ <<label>> ]
[ DECLARE
    declarations ]
BEGIN
    statements
END [ label ];

BEGINEND 在这里不是语句,它们很像 C 或 Java 等编程语言中的 {} 以及 Python 中的缩进。

您可以在 PL/pgSQL 过程中使用事务控制 SQL 语句,但不能显式启动事务,因为您已经在其中,因此不允许使用 BEGIN SQL 语句。如果您结束前一个事务,PL/pgSQL 中会自动启动一个新事务,这必须使用 COMMIT 完成(在 PL/pgSQL 中,END 不允许作为 COMMIT 的同义词)。

【讨论】:

  • 非常感谢,我猜没有办法实现`begin; [代码块1]结束;开始; [code block2] end;` 在 plpgsql 中?
  • 当然可以,如果您省略了BEGIN 之后的分号。但这些都是块,与事务管理无关..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多