postgresql 存储过程开始提交结束

hg6*_*3hg 6 postgresql

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

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

end;
$$
Run Code Online (Sandbox Code Playgroud)

为什么我们使用所有的开始、结束和提交?我对postgresql的理解是“结束”与“提交”相同

begin;
[code block]
end;
Run Code Online (Sandbox Code Playgroud)

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

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

begin;
[code block1]
end;
begin;
[code block2]
end;
Run Code Online (Sandbox Code Playgroud)

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

create or replace procedure update_dba_trades ()
language plpgsql
as $$
begin;
[code block1]
end;
begin;
[code block2]
end;
$$
Run Code Online (Sandbox Code Playgroud)

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

Lau*_*lbe 10

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

在 PL/pgSQL 中,代码被排列在如下所示的中:

[ <<label>> ]
[ DECLARE
    declarations ]
BEGIN
    statements
END [ label ];
Run Code Online (Sandbox Code Playgroud)

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

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