アプリ版:「スタンプのみでお礼する」機能のリリースについて

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;

よろしくお願いします。

A 回答 (3件)

下記ぐらいでいいのではないのでしょうか?


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;
    • good
    • 0

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



一つのブロック内で処理を書いて、例外が発生すれば、後続の処理は打ち切られます。
通常、例外処理を書くのは、例外をキャッチして何らの処理を行いたい場合です。
例えば、#2に書かれているような、例外をキャッチしてRAISEするだけなら、
例外処理は書かなくても一緒です。
(例外時にエラーを表示するなど何らの処理があって初めて例外処理に意味があります)
    • good
    • 0

1ブロック処理だけでしたら、nitorinさんの方法でよいですが、


複数ブロックがあるのでしたら、下記のようにしないといけないです。

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

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

exception
 when others then
   ・・・
end;



 
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!