实际上,在执行 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 中,代码被排列在如下所示的块中:
Run Code Online (Sandbox Code Playgroud)[ <<label>> ] [ DECLARE declarations ] BEGIN statements END [ label ];
BEGIN
这里的andEND
不是语句,它们很像C 或 Java 等编程语言中的{
and以及 Python 中的缩进。}
您可以在 PL/pgSQL 过程中使用事务控制 SQL 语句,但您无法显式启动事务,因为您已经在其中,因此BEGIN
不允许使用 SQL 语句。如果结束前一个事务,PL/pgSQL 中会自动启动一个新事务,必须使用COMMIT
(END
不允许作为COMMIT
PL/pgSQL 的同义词)。
归档时间: |
|
查看次数: |
7871 次 |
最近记录: |