みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

シェルスクリプトでオラクルのエラーメッセージを取得するには

シェルスクリプト上でsqlplusを起動し、さらにSQLの実行結果(エラーメッセージ)を取得するにはどのようにシェルをどのように記述すればよいでしょうか?
----------------------------------------
sqlplus scott/tiger@hoge
SQL>select * from dep;
*
1行でエラーが発生しました。
ORA-00942: 表またはビューが存在しません。
----------------------------------------
上記のようなコマンド実行とエラーメッセージの取得を行いたいのですが、シェルについては超初心者のためよく分かりません。
実行環境は以下の通りですが、ご存知の方教えて頂けないでしょうか。よろしくお願いします。
OS:Red Hat Linux 8.0
DB:Oracle8.1.7

投稿日時 - 2005-05-23 02:41:32

QNo.1404286

暇なときに回答ください

質問者が選んだベストアンサー

記載ミスをしました。最後に(`)が必要です。

受けとる変数=`sqlplus $USER_ID << ++EOF
WHENEVER SQLERROR EXIT SQL.SQLCODE
select * from dep;
++EOF
`

>以下のようにバインド変数の使い方でエラーとなってしまい、シェルで正常終了となりません。
>これについてもお気づきの点がありましたらご指摘願えますでしょうか。

上記の例で、wheneverを書いていますが、これにより自前でEXITしなくとも、
SQLエラー時に自動的に脱出されます。
SQLエラーではないけれど、脱出したい時に、EXITを使うのがよろしいかと
思います。

投稿日時 - 2005-05-24 12:42:51

お礼

お礼が送れまして大変申し訳ありません。
教えて頂いた方法で実行結果を取得できました。
シェルやPL/SQLの基本から勉強せねばと思ってます
ありがとうございました。

投稿日時 - 2005-05-28 16:47:04

このQ&Aは役に立ちましたか?

9人が「このQ&Aが役に立った」と投票しています

回答(3)

順不同にコメントを書いています。

>上記のような記述で正常、異常の判定はできることが分かったのですが

今のやり方で必ずしもエラーが判定できるとは思えません。
例えば、$USER_IDに嘘っぱちが入っていると、シェルの実行は、
途中で止まると思います。(再入力をSQLPLUSが要求するので・・)

>やはり、一旦結果を出力するしかないのでしょうか。

とりあえず、今の方法で問題ないレベルのエラーしかない前提で..
SPOOLを使わずとも、SQL*PLUSは結果とエラー内容を標準出力に
吐くので、それをシェル変数に受けとれば良いと思いますよ?

受けとる変数=`sqlplus $USER_ID << ++EOF
select * from dep;
EXIT :RETURNCODE
++EOF

ただ、想定するエラーのパターンですが、何でも拾えるように考えると
メッセージ行を選抜する方法が思いつきません。
ORA-nnnnnに限定するなら、#1で書かれているように
grepでフィルタすれば良いと思います。

投稿日時 - 2005-05-24 02:27:01

お礼

ご回答ありがとうございました。
"$USER_ID"については実際のテストコードをそのまま載せてしまいました。失礼しました。
ID/PWについては正常にログインできるものとして質問させて下さい。
標準出力を変数に返す方法ですが、回答に書かれてある通り↓に実行してみたのですが、シンタックスエラーとなってしまいます。
RC=`sqlplus $USER_ID << ++EOF
"`"の使い方等の問題なのかもしれませんが、何かまずい点があれば教えて頂けないでしょうか。

さらに、別問題となるのですが、SQL結果が正常終了していても、以下のようにバインド変数の使い方でエラーとなってしまい、シェルで正常終了となりません。
これについてもお気づきの点がありましたらご指摘願えますでしょうか。
------------------------------------------------------------------
SQL>
PL/SQLプロシージャが正常に完了しました。

SQL> 使用方法: { EXIT | QUIT } [ SUCCESS | FAILURE | WARNING | n |
変数 | :バインド変数 ] [ COMMIT | ROLLBACK ]
------------------------------------------------------------------

投稿日時 - 2005-05-24 09:04:19

ANo.1

SQL で SPOOL に結果を出力して
出力されたファイルの中を grep で検索する

検索文字は ORA- これでヒットすればエラーあり

としてみてはいかがでしょうか?

投稿日時 - 2005-05-23 18:11:46

お礼

ご回答ありがとうございます。
やはり、一旦結果を出力するしかないのでしょうか。
実は、シェル実行結果がエラーの場合に特定のエラーログにメッセージを出力する共通コマンドが用意されていまして、
このコマンドの引数にオラクルのエラーコード、エラーメッセージ渡したい訳なのですが、処理結果を直接取得する方法はないものですかね。
-----------------------------------
sqlplus $USER_ID << ++EOF
select * from dep;
EXIT :RETURNCODE
++EOF

if [$? != 0]; then ....
-----------------------------------
上記のような記述で正常、異常の判定はできることが分かったのですが、オラクルの結果の取得方法が分かりません。
説明が至らずに、申し訳ありません。

投稿日時 - 2005-05-23 20:03:21

あなたにオススメの質問