在執行 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;
$$
然后有錯誤。如何實作多個獨立的代碼塊?謝謝!
uj5u.com熱心網友回復:
不要將SQL 陳述句 BEGIN(與 同義START TRANSACTION)和END(與 同義COMMIT)與PL/pgSQL語法元素BEGIN和END.
用PL / pgSQL,代碼被安排在塊那個外表像這樣:
[ <<label>> ] [ DECLARE declarations ] BEGIN statements END [ label ];
BEGIN而END不是陳述句這里,他們是有點像{,并}在Python編程如C或Java語言和縮進。
您可以在 PL/pgSQL 程序中使用事務控制 SQL 陳述句,但不能顯式啟動事務,因為您已經在其中,因此BEGIN不允許使用SQL 陳述句。如果您結束前一個事務,則在 PL/pgSQL 中會自動啟動一個新事務,必須使用COMMIT(在 PL/pgSQL 中END不允許作為同義詞COMMIT) 來完成。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/337137.html
標籤:PostgreSQL
上一篇:將查詢結果作為CSV檔案從DockerPostgreSQL容器匯出到本地機器
下一篇:如何指定生成的NUMRANGE?
