シェルからsqlplusを使用してストアドの呼び出し後の処理について

このQ&Aのポイント
  • ストアドのヘッダ部がコンパイルエラーの場合、EXCEPTIONに引っかかってくれない
  • 本体のコンパイルエラーはEXCEPTIONに引っかかりますが、ヘッダ部のエラーには気づかず処理を続行してしまいます
  • エラーハンドリングの方法についてアドバイスをいただきたい
回答を見る
  • ベストアンサー

シェルからsqlplusたたいて、ストアド呼び出し後の処理について。

質問です。 shellからSqlplus→ストアド呼び出しを行います。 まず、ソースをご覧下さい。 VARIABLE ret NUMBER; DECLARE cnvtStat NUMBER; BEGIN cnvtStat := 0; cnvtStat := PK_TEST.TEST(A); IF ( cnvtStat >= 0 ) THEN :ret := 0; ELSE :ret := 9; END IF; EXCEPTION WHEN OTHERS THEN :ret := 9; END; となっています。 困っていることは ストアドのヘッダ部がコンパイルエラーの場合、 EXCEPTIONに引っかかってくれないのです。 本体のコンパイルエラーはEXCEPTIONに引っかかります。 このままでは、ヘッダがコンパイルエラーで ストアド処理が行われないのに、 呼び出し側では気づかず処理を続行してしまいます。 どのようにエラーハンドリングすればよいのか 皆さんお手数かけますが、アドバイスよろしくお願いします。

  • MXPX
  • お礼率16% (15/91)
  • Oracle
  • 回答数1
  • ありがとう数6

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

  • ベストアンサー
回答No.1

どのようなエラーハンドリングを望んでいるのか、理解できませんが、 SQL*PLUSに流し込むスクリプトの先頭で WHENEVER OSERROR EXIT 2 WHENEVER SQLERROR EXIT 1 という2行を書いておけば、大抵のエラーは、SQL*PLUSの終了コードで SHELL側に引き渡されます。 当然ながら、スクリプトが無かったとかの場合だと、"WHENEVER ~"を食べないので まともな処理は出来ませんが、スクリプトさえあれば、それなりだと思います。

MXPX
質問者

補足

ありがとうございます。 早速試してみます。

関連するQ&A

  • シェルからのストアド起動

    シェル初心者です。 シェルからストアドを起動したいのですが、 OUTパラメーターの取得ができません。 sample_prcがストアドで、 第一引数:INパラメータ,型NUMBER 第二引数:OUTパラメータ,型NUMBER となっています。 どのようにすればよいのかアドバイスをお願いします。 --------------------------------------------------------- IN_DATA=9999 OUT_DATA=0 echo 'start' sqlplus sample_user/sample_pass@sample_host << EOF exec sample_prc($IN_DATA,$OUT_DATA); exit EOF echo $OUT_DATA echo 'end'

  • postgresのストアドファンクションでエラーの

    postgresのストアドファンクションでエラーの拾い方を教えてください。 insertして重複したらアップデートに切り替えるというサンプルをよく見かけます。 DECLARE BEGIN insert文 RETURN TRUE; EXCEPTION WHEN unique_violation THEN update文 END; それと同じノリで、何かしらのエラーがあった時に、 『RETURN FALSE;』するか、もしくはエラーコードをそのまま拾って返すというようなサンプルが欲しいです。 DECLARE BEGIN 何かしらのSQL RETURN TRUE; EXCEPTION WHEN すべてのエラー THEN RETURN FALSE; END; DECLARE BEGIN 何かしらのSQL RETURN TRUE; EXCEPTION WHEN すべてのエラー THEN RETURN エラーコード; END;

  • プロシージャの戻り値を取得する方法

    perlからSQLPLUS->プロシージャを実行してその戻り値を取得。 戻り値が0なら次の処理へ、0以外ならエラー処理へというようなことをやりたいと思っています。 perlの実行コマンドは以下。 $sqlcmd = "sqlplus$DBUSER$PASS\@DB_ALIAS\@$SQLFILE $OUTFILE"; $sql_ret = system("$sqlcmd") >>8; この$sql_retにプロシージャの戻り値が入るようにしたいのです。 プロシージャを実行する$SQLFILEは以下のようなSQLです。 --------------------------------------------------- set serveroutput on WHENEVER SQLERROR EXIT 1 spool &1; DECLARE RetVal NUMBER; BEGIN RetVal := 実行ストアドファンクション; END; / spool off; EXIT SQL.SQLCODE; ---------------------------------------------- エラーが起きたときにファンクションは1を返すようにしているのですが、 それがSQLPLUSの実行結果の戻り値に反映されません。 どうしたらいいのでしょうか? よろしくお願いします。

  • PowerShellのtrapの例外処理について

    初歩的な質問ですが、PowerShellのtrapの例外処理ついて教えて下さい。 以下のようなスクリプトがあります。 ------------------------------------------------- test1.ps1 trap [Exception] { echo "trap!!" } 5/0 echo "go go" ------------------------------------------------- test2.ps1 trap [Exception] { echo "trap!!" } function fun($num) { 5/$num } fun 0 echo "go go" test1.ps1はtrapに遷移しないのですが、test2.ps1はtrapに遷移します。 どうしてなのでしょうか。 コマンドレットでエラーが発生した場合ののエラーハンドリングであって 「5/0」のような処理はコマンドレットでのエラーではないのでハンドリング されないのでしょうか。 では、なぜ、関数するとハンドリングされるのでしょうか。

  • ストアド実行時のエラー「参照しているコレクションは初期化されていません」

    以下のようなパッケージを作っています。 CREATE OR REPLACE PACKAGE "TEST"."TEST_P" as type test_type1 is table of TEST.TEST_TABLE%ROWTYPE; procedure test2 (ret OUT test_type1 ) ; end; ----------------------------------- 本体 ----------------------------------- CREATE OR REPLACE PACKAGE BODY "TEST"."TEST_P" as procedure test2( ret OUT test_type1 ) is cursor basic_cusor is select * from TEST.TEST_TABLE; BEGIN open basic_cusor; loop fetch basic_cusor into ret(0); exit when basic_cusor%notfound; END loop; END TEST3; end; ---------------------------------------- これをSQL Pluseから set serveroutput on; declare  arg1 TEST.TEST_P.test_type1; begin TEST.TEST_P.test2(arg1); dbms_output.put(arg1(0).coulm1); end; のように実行するとエラーが出ます。 初期化処理とはどのように行えばいいのでしょうか? 最終的にはSQLServerのストアドようにテーブル のような構造で値を返えせればいいです。

  • ストアドプロシージャの引数にフィールド名を指定したい

    以下のようにストアドプロシージャを作成し、 ------------------------------------------------------------ CREATE FUNCTION test(integer) RETURNS integer AS'  DECLARE   aaa ALIAS FOR $1;  BEGIN   IF aaa BETWEEN 1 AND 5 THEN    RETURN 5;   ELSIF aaa BETWEEN 6 AND 10 THEN    RETURN 10;   ELSIF aaa BETWEEN 11 AND 15 THEN    RETURN 15;   END IF;  END;' LANGUAGE 'plpgsql'; ------------------------------------------------------------ 以下のようなSQL構文でこのプロシージャを使用したいと思っています。 ------------------------------------------------------------ select test(フィールド名) from テーブル名; ※「フィールド名」のフィールドにはinteger型のデータが入っています。 ------------------------------------------------------------ が、このSQLを実行すると以下のようなエラーが出ます。(CSE使用) ------------------------------------------------------------ WARNING: Error occurred while executing PL/pgSQL function test WARNING: at END of toplevel PL block WARNING: Error occurred while executing PL/pgSQL function test WARNING: at END of toplevel PL block SQL実行中に以下のエラーが発生しました。 WARNING: at END of toplevel PL block ------------------------------------------------------------ このように、ストアドプロシージャの引数にフィールド名を指定することはできないのでしょうか。 どなたかご教示ください。

  • ORACLE PL/SQLの例外処理について

    ストアドプロシージャを登録したところ、「EXCEPTION」キーワードをORACLEが 認識してくれずエラーが返ってきました。どうしてか教えて下さい。 よろしくお願いします プロシージャのコード) CREATE OR REPLACE PRCEDURE TEST_PROC( P1 OUT NUMBER, P2 OUT VARCHAR2 ) AS BEGIN UPDATE VIEW経理システム制御F SET 処理状況 = ''; COMMIT; EXCEPTION WHEN OTHERS THEN P1 := SQLCODE; P2 := SQLERRM; END; / 登録時のメッセージ) エラー行: 1: エラーが発生しました。 ORA-00922: オプション指定されていないか、または無効です 不明なコマンドです(開始"EXCEPTION ...")。行の残りは無視されました。 不明なコマンドです(開始"P1 := SQLC...")。行の残りは無視されました。 不明なコマンドです(開始"P2 := SQLE...")。行の残りは無視されました。 不明なコマンドです("END")。行の残りは無視されました。

  • VBAで時間による処理判定

    こんにちは。 エクセルVBAにて次のようなプログラムを作成しておりますが思考のループに入ってしまった為御助力をお願いします。 メインルーチンをキーボード「↑」が押されるまでループする。 その中で処理Aを1秒間隔、処理Bを5秒間隔、処理Cを30秒間隔に実行させる。 ※今回はサンプルコードの為DEBUG.PRINTを実行させる。 現状ループの中にApiSleepを入れ1/1000で制御しています。 処理を実行させると若干もたつきが感じられます。 正確な時間計測は必要としていませんのでシステム日付程度の精度を求めています。 方法は幾つかあると思いますがご協力をお願いします。 以下サンプルコード Public Type TestType   XTime As Integer   XBack As Integer End Type Sub Sample()   Dim KeyChk As Integer   'Dim ThisTime As Integer   Dim Ret1 As TestType   Dim Ret2 As TestType   Dim Ret3 As TestType   KeyChk = 0   With Ret1     .XTime = 1     .XBack = .XTime   End With   With Ret2     .XTime = 5     .XBack = .XTime   End With   With Ret3     .XTime = 30     .XBack = .XTime   End With   Do     KeyChk = GetAsyncKeyState(VK_UP)     Sleep (1000)     'ThisTime = ((Hour(Time) * 60) + Minute(Time) * 60) + Second(Time)     With Ret1       If .XTime = 0 Then         Debug.Print "処理A実行"         .XTime = .XBack       Else         .XTime = .XTime - 1       End If     End With     With Ret2       If .XTime = 0 Then         Debug.Print "処理B実行"         .XTime = .XBack       Else         .XTime = .XTime - 1       End If     End With     With Ret3       If .XTime = 0 Then         Debug.Print "処理C実行"         .XTime = .XBack       Else         .XTime = .XTime - 1       End If     End With   Loop While KeyChk = 0   MsgBox ("終了") End Sub API宣言及び仮想キー宣言は省略

  • .NETからストアドプロシージャを実行

    VB.Netからストアドプロシージャを実行するプログラムの書き方がよく分かりません。 データベースはOracleです。 PROCEDURE test(aaa IN number, bbb IN varvhar2, ccc IN OUT varchar2); といったPL/SQLをVB.NET上で実行するとします。 (略:データベースへの接続処理) strSql = "begin test(10, 'テスト', '');end;" 結果「式が割り当てられていません」とエラーが出ます。 すべての引数がINのプロシージャでは、上記の方法で実行できたので、IN OUTへの引数の渡し方に問題があると思うのですが、どうしても分かりません。 まだ使い始めたばかりで、どうしていいかまったく分からない状態です。 どうかご指導お願い致します。

  • ストアドでの値のとり方について

    以下のようなストアドでac_valueのcase文3の時は'ZZZ'のところに ac_testの値を入れたいのですが、どうすればよろしいでしょうか? SQLServer2000です。 よろしくお願い致します。 CREATE PROCEDURE usp_testA AS BEGIN SELECT A.filed1, A.filed2, (CASE A.filed3 WHEN 1 THEN 'SSS' ELSE 'TTT' END )ac_test, B.filed1, (CASE B.filed5 WHEN 1 THEN 'WWW' WHEN 2 THEN 'XXX' WHEN 3 THEN 'ZZZ' )ac_value FROM Ytable A Wtable B WHERE ・・・・・・ END GO