- ベストアンサー
シェルスクリプトでオラクルのエラーメッセージを取得するには
シェルスクリプト上でsqlplusを起動し、さらにSQLの実行結果(エラーメッセージ)を取得するにはどのようにシェルをどのように記述すればよいでしょうか? ---------------------------------------- sqlplus scott/tiger@hoge SQL>select * from dep; * 1行でエラーが発生しました。 ORA-00942: 表またはビューが存在しません。 ---------------------------------------- 上記のようなコマンド実行とエラーメッセージの取得を行いたいのですが、シェルについては超初心者のためよく分かりません。 実行環境は以下の通りですが、ご存知の方教えて頂けないでしょうか。よろしくお願いします。 OS:Red Hat Linux 8.0 DB:Oracle8.1.7
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
記載ミスをしました。最後に(`)が必要です。 受けとる変数=`sqlplus $USER_ID << ++EOF WHENEVER SQLERROR EXIT SQL.SQLCODE select * from dep; ++EOF ` >以下のようにバインド変数の使い方でエラーとなってしまい、シェルで正常終了となりません。 >これについてもお気づきの点がありましたらご指摘願えますでしょうか。 上記の例で、wheneverを書いていますが、これにより自前でEXITしなくとも、 SQLエラー時に自動的に脱出されます。 SQLエラーではないけれど、脱出したい時に、EXITを使うのがよろしいかと 思います。
その他の回答 (2)
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
順不同にコメントを書いています。 >上記のような記述で正常、異常の判定はできることが分かったのですが 今のやり方で必ずしもエラーが判定できるとは思えません。 例えば、$USER_IDに嘘っぱちが入っていると、シェルの実行は、 途中で止まると思います。(再入力をSQLPLUSが要求するので・・) >やはり、一旦結果を出力するしかないのでしょうか。 とりあえず、今の方法で問題ないレベルのエラーしかない前提で.. SPOOLを使わずとも、SQL*PLUSは結果とエラー内容を標準出力に 吐くので、それをシェル変数に受けとれば良いと思いますよ? 受けとる変数=`sqlplus $USER_ID << ++EOF select * from dep; EXIT :RETURNCODE ++EOF ただ、想定するエラーのパターンですが、何でも拾えるように考えると メッセージ行を選抜する方法が思いつきません。 ORA-nnnnnに限定するなら、#1で書かれているように grepでフィルタすれば良いと思います。
お礼
ご回答ありがとうございました。 "$USER_ID"については実際のテストコードをそのまま載せてしまいました。失礼しました。 ID/PWについては正常にログインできるものとして質問させて下さい。 標準出力を変数に返す方法ですが、回答に書かれてある通り↓に実行してみたのですが、シンタックスエラーとなってしまいます。 RC=`sqlplus $USER_ID << ++EOF "`"の使い方等の問題なのかもしれませんが、何かまずい点があれば教えて頂けないでしょうか。 さらに、別問題となるのですが、SQL結果が正常終了していても、以下のようにバインド変数の使い方でエラーとなってしまい、シェルで正常終了となりません。 これについてもお気づきの点がありましたらご指摘願えますでしょうか。 ------------------------------------------------------------------ SQL> PL/SQLプロシージャが正常に完了しました。 SQL> 使用方法: { EXIT | QUIT } [ SUCCESS | FAILURE | WARNING | n | 変数 | :バインド変数 ] [ COMMIT | ROLLBACK ] ------------------------------------------------------------------
- raphel_7
- ベストアンサー率34% (86/252)
SQL で SPOOL に結果を出力して 出力されたファイルの中を grep で検索する 検索文字は ORA- これでヒットすればエラーあり としてみてはいかがでしょうか?
お礼
ご回答ありがとうございます。 やはり、一旦結果を出力するしかないのでしょうか。 実は、シェル実行結果がエラーの場合に特定のエラーログにメッセージを出力する共通コマンドが用意されていまして、 このコマンドの引数にオラクルのエラーコード、エラーメッセージ渡したい訳なのですが、処理結果を直接取得する方法はないものですかね。 ----------------------------------- sqlplus $USER_ID << ++EOF select * from dep; EXIT :RETURNCODE ++EOF if [$? != 0]; then .... ----------------------------------- 上記のような記述で正常、異常の判定はできることが分かったのですが、オラクルの結果の取得方法が分かりません。 説明が至らずに、申し訳ありません。
お礼
お礼が送れまして大変申し訳ありません。 教えて頂いた方法で実行結果を取得できました。 シェルやPL/SQLの基本から勉強せねばと思ってます ありがとうございました。