2017-02-02 4 views
0

何か親切な魂は、これがどこで間違っているのかを指摘できますか? 私は非常に単純なトランザクションテストを実行しようとしていますが、実行する文も取得できません。私は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ブロックにありますか?

+0

は 'BEGIN ... ENDは取引に関する** **ではありません。これは構文ブロックです。たとえば、JavaやC++の '{...}'のように、 'DO'ブロックは無名関数であり、Postgres(あるいはその点ではSQL Server)の関数でトランザクション制御を行うことはできません。残念ながら、Postgresにはストアドプロシージャがありませんので、コールコード –

+0

でトランザクションを管理する必要があります。PlPgSqlで 'START TRANSACTION;'が嫌いです。例外ブロック –

+0

@ a_horse_with_no_nameから始まらないでください。私はこれを明確にしている:C#のlibsを使用して接続を開いて、その接続を介して "トランザクション開始"ステートメントを発行し、後で接続を終了する前に "ロールバック"または "コミット"を発行する唯一の方法は? –

答えて

0

あなたの質問に答える - この文がどこにあるかを指摘することは間違っている:START TRANSACTION;ないEXCEPTIONブロックでBEGINの文...

私はあなたがやろうかわからないんだけど。ここでは(表tが作成さではなく、コミット=>が存在しない)ロールバックされたトランザクションの一例である、まだ例外(/ 0)キャッチされ、処理(調達情報):PL/pgSQLで

t=# begin; 
BEGIN 
Time: 0.124 ms 
t=# 
t=# DO $$ 
t$# BEGIN 
t$# begin 
t$#  create table t (i int); 
t$# end; 
t$#  perform 1/0; 
t$# EXCEPTION WHEN division_by_zero THEN 
t$# BEGIN 
t$#  raise info '%','exc catched'; 
t$# END; 
t$# 
t$# END; 
t$# $$ 
t-# ; 
INFO: exc catched 
DO 
Time: 10.288 ms 
t=# 
t=# rollback; 
ROLLBACK 
Time: 0.152 ms 
t=# 
t=# \dt+ t 
No matching relations found. 
t=# ; 
Time: 0.062 ms 
+0

あなたの応答、Vaoに感謝します。私はa_horse_with_no_nameが私の質問に答えたと思う。 –

関連する問題