質問 |
||
| 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 |
|
| |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |