ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.3502557 PL/SQLのエラー処理について
質問者:w0a15455 PL/SQLを勉強し始めたのですが、テーブルを作成してから、データを流し込むという処理をしたいのですが、テーブルの作成に失敗しらたら、処理を終了させるという処理はできないのでしょうか?
それとも、考え方が違うのでしょうか?アドバイスお願いします。
次のようにPL/SQLを作成しています。
例)
declare
curHandle1 INTEGER;
begin
curHandle1 := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(curHandle1, 'create table xxx as select * from xxx where ID=-1', DBMS_SQL.V7);
DBMS_SQL.CLOSE_CURSOR(curHandle1);
exception
when OTHERS then
エラーになったら、処理終了したい(次のブロックにいきたくない)
end;
declare
begin
     insert into xxx NOLOGGING values (1,'test');
end;

よろしくお願いします。
困り度:
  • すぐに回答を!
質問投稿日時:
07/11/09 11:20
この質問に対する回答は締め切られました。

回答

ANo.3 まず、なぜブロックを分けるのですか?(分けるからには理由があるんですよね?)

一つのブロック内で処理を書いて、例外が発生すれば、後続の処理は打ち切られます。
通常、例外処理を書くのは、例外をキャッチして何らの処理を行いたい場合です。
例えば、#2に書かれているような、例外をキャッチしてRAISEするだけなら、
例外処理は書かなくても一緒です。
(例外時にエラーを表示するなど何らの処理があって初めて例外処理に意味があります)
回答者:k_o_r_o_c_h_a_n
種類:回答
どんな人:一般人
自信:参考意見
回答日時:
07/11/11 16:46
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答良回答10pt

ANo.2 1ブロック処理だけでしたら、nitorinさんの方法でよいですが、
複数ブロックがあるのでしたら、下記のようにしないといけないです。

declare
・・・
begin
 ・・・
 begin
  ・・・
 exception
  when others then
   raise;
 end;

 begin
  ・・・
 exception
  when others then
   raise;
 end;

exception
 when others then
   ・・・
end;



 
回答者:trictrac
種類:回答
どんな人:専門家
自信:自信あり
回答日時:
07/11/10 07:04
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答良回答20pt

ANo.1 下記ぐらいでいいのではないのでしょうか?
create table でエラーが発生した場合、PL/SQLブロック(BEGIN,ENDで
括られた範囲)内の次の行は実行されず、次の実行はException以下の行にジャンプします。


declare
 curHandle1 INTEGER;
begin
 curHandle1 := DBMS_SQL.OPEN_CURSOR;
 DBMS_SQL.PARSE(curHandle1, 'create table xxx as select * from xxx where ID=-1', DBMS_SQL.V7);
 DBMS_SQL.CLOSE_CURSOR(curHandle1);

 insert into xxx NOLOGGING values (1,'test');

exception
when OTHERS then
・・・・
end;
回答者:nitorin
種類:アドバイス
どんな人:専門家
自信:参考意見
回答日時:
07/11/09 13:22
この回答へのお礼この回答にお礼をつける(質問者のみ)