シェルスクリプト上でsqlplusを起動し、さらにSQLの実行結果(エラーメッセージ)を取得するにはどのようにシェルをどのように記述すればよいでしょうか?
----------------------------------------
sqlplus scott/tiger@hoge
SQL>select * from dep;
*
1行でエラーが発生しました。
ORA-00942: 表またはビューが存在しません。
----------------------------------------
上記のようなコマンド実行とエラーメッセージの取得を行いたいのですが、シェルについては超初心者のためよく分かりません。
実行環境は以下の通りですが、ご存知の方教えて頂けないでしょうか。よろしくお願いします。
OS:Red Hat Linux 8.0
DB:Oracle8.1.7
No.1
- 回答日時:
SQL で SPOOL に結果を出力して
出力されたファイルの中を grep で検索する
検索文字は ORA- これでヒットすればエラーあり
としてみてはいかがでしょうか?
ご回答ありがとうございます。
やはり、一旦結果を出力するしかないのでしょうか。
実は、シェル実行結果がエラーの場合に特定のエラーログにメッセージを出力する共通コマンドが用意されていまして、
このコマンドの引数にオラクルのエラーコード、エラーメッセージ渡したい訳なのですが、処理結果を直接取得する方法はないものですかね。
-----------------------------------
sqlplus $USER_ID << ++EOF
select * from dep;
EXIT :RETURNCODE
++EOF
if [$? != 0]; then ....
-----------------------------------
上記のような記述で正常、異常の判定はできることが分かったのですが、オラクルの結果の取得方法が分かりません。
説明が至らずに、申し訳ありません。
No.2
- 回答日時:
順不同にコメントを書いています。
>上記のような記述で正常、異常の判定はできることが分かったのですが
今のやり方で必ずしもエラーが判定できるとは思えません。
例えば、$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 ]
------------------------------------------------------------------
No.3ベストアンサー
- 回答日時:
記載ミスをしました。
最後に(`)が必要です。受けとる変数=`sqlplus $USER_ID << ++EOF
WHENEVER SQLERROR EXIT SQL.SQLCODE
select * from dep;
++EOF
`
>以下のようにバインド変数の使い方でエラーとなってしまい、シェルで正常終了となりません。
>これについてもお気づきの点がありましたらご指摘願えますでしょうか。
上記の例で、wheneverを書いていますが、これにより自前でEXITしなくとも、
SQLエラー時に自動的に脱出されます。
SQLエラーではないけれど、脱出したい時に、EXITを使うのがよろしいかと
思います。
お礼が送れまして大変申し訳ありません。
教えて頂いた方法で実行結果を取得できました。
シェルやPL/SQLの基本から勉強せねばと思ってます
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
これ何て呼びますか Part2
あなたのお住いの地域で、これ、何て呼びますか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
sqlのエラーハンドリングについて質問です。
Oracle
-
バッチからsqlplusの接続エラーの検知について
その他(プログラミング・Web制作)
-
SQLPLUSで結果を画面に表示しない
Oracle
-
-
4
PL/SQLで@ファイル名が反応しません
Oracle
-
5
sqlplusで実行したSQLの結果をシェルで判定する方法
Oracle
-
6
Oracleでの文字列連結サイズの上限
Oracle
-
7
oracle spool SJIS → UTF-8
Oracle
-
8
sqlplusで表示が変なので、出力を整形したい。
Oracle
-
9
SQL*PLUSを終了させる方法
Oracle
-
10
Linuxで標準出力したファイルの文字コードついて
UNIX・Linux
-
11
カーソル0件の時にエラーを発生させる
Oracle
-
12
batファイルでのSQL(oracle)実行エラーについて
Oracle
-
13
PL/SQLでSPOOLさせたいのですが、可能でしょうか?
Oracle
-
14
SQL>UPDATEと同時にその件数をCOUNTする方法
その他(データベース)
-
15
SQL Plusで項目名が最後まで表示されない?
Oracle
-
16
oracleの文字コードとlinuxサーバの文字コードが異なる場合、サ
その他(コンピューター・テクノロジー)
-
17
SELECT INTOで一度に複数の変数へ代入をするにはどのようにすれがよいでしょうか?
PostgreSQL
-
18
crontabでsql/plusの起動
その他(OS)
-
19
PL/SQL exceptionを呼び出すには?
Oracle
-
20
SQL*Plus:SPOOLコマンドでのSQL出力
その他(データベース)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ORA-01013のエラーについて経験...
-
CASE文のエラーについて
-
PL/SQLのコンパイルエラーにつ...
-
ORA-01843: 指定した月が無効で...
-
シェルスクリプトでオラクルの...
-
PL/SQL PLS-00103エラーについて
-
PL/SQLによるCREATE TABLE後のI...
-
はじめまして!
-
無効なSQL文の具体例を教えてく...
-
「ORA-00907: 右カッコがありま...
-
TO_DATE関数について
-
インポート時のエラーについて
-
PL/SQLでPLS-00201のエラー
-
データベースのカラムの型がCHA...
-
エラー「単一グループのグルー...
-
ORA-14459: GLOBALキーワードが...
-
マテリアライズドビューの更新...
-
ビューが作成できない
-
DATABSE LINKについて
-
トリガーのエラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ORA-01013のエラーについて経験...
-
CASE文のエラーについて
-
PL/SQLのコンパイルエラーにつ...
-
ORA-01843: 指定した月が無効で...
-
「ORA-00907: 右カッコがありま...
-
PL/SQL PLS-00103エラーについて
-
PCC-S-02201エラーの対処を教え...
-
はじめまして!
-
データベースのカラムの型がCHA...
-
SQLLOADER
-
ストアドファンクションの実行
-
無効なSQL文の具体例を教えてく...
-
sqlのエラーハンドリングについ...
-
シェルスクリプトでオラクルの...
-
ORA-06502のエラー
-
DATABSE LINKについて
-
PL/SQLでPLS-00201のエラー
-
HAVING句でのBETWEEN演算子
-
ORA-14459: GLOBALキーワードが...
-
ACCESSでパススルークエリにパ...
おすすめ情報