实际上,在执行 postgresql 存储过程时我很困惑(我从某处学到了以下内容):
create or replace procedure update_dba_trades ()
language plpgsql
as $$
begin
[CODE BLOCK WITH INSERT DELETE ETC...]
commit;
end;
$$
为什么我们使用所有的开始、结束和提交?我对postgresql的理解是“结束”与“提交”相同
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;
$$
然后就有错误了。如何实现多个独立的代码块?谢谢!
不要混淆SQL语句 https://www.postgresql.org/docs/current/sql-commands.html BEGIN
(同义于START TRANSACTION
) and END
(同义于COMMIT
)与PL/pgSQL https://www.postgresql.org/docs/current/plpgsql.html语法元素BEGIN
and END
.
在PL/pgSQL中,代码安排在blocks那个表情像这样 https://www.postgresql.org/docs/current/plpgsql-structure.html:
[ <<label>> ]
[ DECLARE
declarations ]
BEGIN
statements
END [ label ];
BEGIN
and END
这里不是陈述,它们更像是{
and }
C 或 Java 等编程语言中的缩进以及 Python 中的缩进。
您可以在 PL/pgSQL 过程中使用事务控制 SQL 语句,但您无法显式启动事务,因为您已经在其中,因此BEGIN
不允许使用 SQL 语句。如果结束前一个事务,PL/pgSQL 中会自动启动一个新事务,这必须通过COMMIT
(END
不允许作为同义词COMMIT
在 PL/pgSQL 中)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)