シェルからsqlplusを使用してストアドの呼び出し後の処理について
- ストアドのヘッダ部がコンパイルエラーの場合、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
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
どのようなエラーハンドリングを望んでいるのか、理解できませんが、 SQL*PLUSに流し込むスクリプトの先頭で WHENEVER OSERROR EXIT 2 WHENEVER SQLERROR EXIT 1 という2行を書いておけば、大抵のエラーは、SQL*PLUSの終了コードで SHELL側に引き渡されます。 当然ながら、スクリプトが無かったとかの場合だと、"WHENEVER ~"を食べないので まともな処理は出来ませんが、スクリプトさえあれば、それなりだと思います。
関連する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;
- ベストアンサー
- PostgreSQL
- プロシージャの戻り値を取得する方法
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の実行結果の戻り値に反映されません。 どうしたらいいのでしょうか? よろしくお願いします。
- 締切済み
- Perl
- 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のストアドようにテーブル のような構造で値を返えせればいいです。
- ベストアンサー
- Oracle
- ストアドプロシージャの引数にフィールド名を指定したい
以下のようにストアドプロシージャを作成し、 ------------------------------------------------------------ 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 ------------------------------------------------------------ このように、ストアドプロシージャの引数にフィールド名を指定することはできないのでしょうか。 どなたかご教示ください。
- 締切済み
- PostgreSQL
- 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宣言及び仮想キー宣言は省略
- 締切済み
- Visual Basic
- .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への引数の渡し方に問題があると思うのですが、どうしても分かりません。 まだ使い始めたばかりで、どうしていいかまったく分からない状態です。 どうかご指導お願い致します。
- ベストアンサー
- Visual Basic
- ストアドでの値のとり方について
以下のようなストアドで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
- ベストアンサー
- SQL Server
補足
ありがとうございます。 早速試してみます。