dポイントプレゼントキャンペーン実施中!

SQL*Plus内でPL/SQL、SQLを実行するシェルスクリプトを書いています。

イメージ
sqlplus scott/tiger << EOF
  declare
    aaa number;
  begin
    -- *1
    select col1 into aaa from test1;
  end;
  /

  -- *2
  define a=1
  define b=1
  @test.sql
EOF


ここで*1にて例えば複数行が返ってくるなどのエラーが
発生した場合、*2以降のSQLを実行せずにSQL*Plusから抜けたいのですが
どのようにすればよいかわかりますでしょうか。

whenever sqlerror exit 255

などはPL/SQL内の論理エラーはハンドリングしてくれないようです。

よろしくお願いします。

それかdefineや@マーク指定によるsqlファイルの取り込みを
PL/SQLの中で実行できる方法を教えていただく方法でも
当方が実施したいことはできるのでそれでもかまいません。

A 回答 (1件)

SQLPLUSで投入したPL/SQL無名ブロック内でのエラーでも、「whenever sqlerror ~」で、


キャッチできますよ。少なくともWindows版SQLPUSは、そういう動作です。
発生源が、SQL文であっても、PL/SQL無名ブロックでも、ORA-nnnnnのエラーを拾わないと
「whenever sqlerror ~」の意味が無いですからね。

この回答への補足

whenever sqlerrorでハンドリングできるのは構文間違いやテーブルが存在しないといった
SQL*Plusとしてのエラーが発生したときだけで
二行ヒットや0件ヒットといったPL/SQLとしてEXCEPTION句にハンドリングされるようなエラー
はwhenever sqlerrorではハンドリングできずにPL/SQL部のEXCEPTION句内の処理を
実行した後に、その後のSQL部も実行されてしまうのではないでしょうか。

それで困っています。RAISE句などでORAエラーを起こせばwhenever sqlerrorにひっかかって
くれるんですかね。

補足日時:2010/05/07 21:32
    • good
    • 0

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