何か親切な魂は、これがどこで間違っているのかを指摘できますか? 私は非常に単純なトランザクションテストを実行しようとしていますが、実行する文も取得できません。私はPG AdminのSQLクエリウィンドウでそれを実行しようとしています。データベースへの他の接続はありません。例外ブロック内のトランザクション - どのように?
DO $$
BEGIN
START TRANSACTION;
UPDATE IsolationTests SET Col1 = 2;
perform pg_sleep(5.0);
ROLLBACK;
EXCEPTION WHEN division_by_zero THEN
BEGIN
END;
END $$;
私はトランザクションレベルで遊び、コード内でトランザクションを開始したり終了したいと考えています。私が "START TRANSACTION" & "ROLLBACK"をコメントアウトすると、その文はうまく動作します。それらのコメントを解除し、私は
"ERROR: cannot begin/end transactions in PL/pgSQL HINT: Use a BEGIN block with an EXCEPTION clause instead."
ええとを取得しますか?それはBEGIN ... EXCEPTIONブロックにありますか?
は 'BEGIN ... ENDは取引に関する** **ではありません。これは構文ブロックです。たとえば、JavaやC++の '{...}'のように、 'DO'ブロックは無名関数であり、Postgres(あるいはその点ではSQL Server)の関数でトランザクション制御を行うことはできません。残念ながら、Postgresにはストアドプロシージャがありませんので、コールコード –
でトランザクションを管理する必要があります。PlPgSqlで 'START TRANSACTION;'が嫌いです。例外ブロック –
@ a_horse_with_no_nameから始まらないでください。私はこれを明確にしている:C#のlibsを使用して接続を開いて、その接続を介して "トランザクション開始"ステートメントを発行し、後で接続を終了する前に "ロールバック"または "コミット"を発行する唯一の方法は? –