• 締切済み

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

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
  • 回答数1
  • ありがとう数0

みんなの回答

回答No.1

特殊変数$!を使えば良いんじゃないかと思います。 $sqlcmd = "sqlplus$DBUSER$PASS\@DB_ALIAS\@$SQLFILE $OUTFILE"; system("$sqlcmd") || $sql_ret=$!;

関連するQ&A

  • bashで実行したsqlの実行結果の戻り値

    bashで実行したsqlの実行結果の戻り値 bashを使用して、DB間の通信の監視を行なおうとしております shellの内容はサーバAでoracleに接続(sqlplus)して、 そこからサーバBへ接続(connect)するだけの記述です。 この時、 MSG=`sqlplus ID/PASSWORD@SID @connect.sql` echo XXX で、@connect.sqlの実行結果を戻り値としてechoさせたいのですが、 この場合、どのように指定すればよいのでしょうか? (上記の状態でshellを実行すると、connect側ではなく、 sqlplusの戻り値が戻ってきてしまいます) ※conenct.sql connect 接続先DBのID/PASSWORD@接続先 exit だけのsqlで、こちらの接続確認は取れております

  • osqlによるストアド実行の戻り値

    方法を探しています。 何か案があったらご教授ください。 現在バッチファイル(.bat)を作成しており、 その中でosqlによりプロシージャを実行しています。 そのプロシージャの中で、正常終了なら0、異常終了なら9を 戻しています。 osql /U [ユーザ名] /P [パスワード] /d [DB名] /S [サーバ名] /q EXIT("DECLARE @ret INT; EXEC @ret = SP名 引数1,引数2; SELECT @ret;") >> log.txt この方法だと、log.txtに ----------- 0 と出力されます。 できればこれを出力せずに、戻り値を取得したいのですが、、 何か方法はありませんでしょうか?

  • shellからsqlplusでコマンドを順次実行

    shellスクリプトから sqlplus @AAA.sqlを実行する。 以下:AAA.sql @home/~/aaa.sql @home/~/bbb.sql quit; 以下:aaa.sql exec dbms_refresh('XXX'); 以下:bbb.sql set serveroutput on set linesize 1000 set pagesize 0 set trimspool on set feedback off whenever oserror exit 9 whenever sqlerror exit 5 MERGE ~ 中略 commit; exit ---------------- 以上、がソース内容です。 aaa.sqlでexitしていないのにbbb.sqlへ処理が移行しません。 ログ見てみるとリフレッシュコマンド実行後に接続が切れてしまっているようです。 処理概要ですが、あるMVをリフレッシュ後にそのMVを使用してMERGE文を実行するという処理です。 上記説明で原因特定は可能でしょうか? よろしくお願いいたします。

  • 外部プログラム実行時の戻り値

    こんにちは。 PHP初心者です。 環境はWindousXP PHP5 DBはPostgre(多分。)です。 今、PHPでexecを使って外部プログラムを走らせたいのですが、失敗しているようで、戻り値はなにしても1が返ってきます。 処理としては、 (PHP) $bat = 'C:/Documents and Settings/Administrator/デスクトップ/test/test.bat' exec($bat, $out, $ret); echo $ret; (batの中身) sqlplus id/pass@test @"C:/Documents and Settings/Administrator/デスクトップ/test/処理.txt" (処理.txtの中身)←coldfusionで書かれています。 -- 対象外のデータを削除する delete from table where knd = 0; commit; exit; という感じです。 わざと処理.txtの中身を壊したり、execではなくsystemやpassthruを使ったり色々試しましたが、$retは1のままで、$outの中身もないので実行されてないような気がします。 なぜ実行されないのか、処理.txtが正常に実行されたのか戻り値を取得したいです。。 とても初歩的な質問で申し訳ないのですが、ご教授よろしくお願いします。

    • 締切済み
    • PHP
  • sqlのエラーハンドリングについて質問です。

    シェルからsqlplusを実行し、そのsqlplusで発生したエラーをハンドリングするために、 出力内容をORACLEエラーコード(ORA-xxxxx)、SQLPLUSエラーコード(SP2-xxxxx) で検索して判定しています。 また、SQLで何らかのエラーが発生した際に処理を終了させるために、 SQL実行前に whenever sqlerror exit; whenever oserror exit; を定義しています。 何らかのエラーが発生した際は、ORACLEエラーコード(ORA-xxxxx)、SQLPLUSエラーコード(SP2-xxxxx) が出力されるため、エラーハンドリングは可能と考えているのですが、 sqlplusのstartコマンドでsqlファイルを実行した場合のみ、エラーコードが出 力されないため、ハンドリングできません。 ■実行例 SQL> start 存在しないsqlファイル O/Sメッセージ:No such file or directory 切断しました。 試しにwhenever oserror exit;の記述を削除したところ SP2-0130が出力されエラーハンドリングできました。 whenever oserror exit; の記述があるとエラーコードが出力されないのはなぜでしょうか??

  • ストアドプロシージャでのOracle Sqlcodeの環境差異について

    ストアドプロシージャでのOracle Sqlcodeの環境差異について <質問詳細> 【事象】 ストアドプロシージャ実行時、Data Not Found時に、ふたつのOracle環境にて 異なる動作がみられました。 (1)環境A(Release 9.2.0.8.0)  NotFound時、例外が発生する(SQLCODE=100) (2)環境B(Release 9.2.0.6.0)  NotFound時、例外は発生せず、SQLCODEを判断するロジック  (下記IF SQLCODE = 0 THEN …)にすすむ。 ※実行したストアドプロシージャはSQLは以下の通り SELECT COLUMN_A, COLUMN_B, COLUMN_C INTO SP_COLUMN_A, SP_COLUMN_B, SP_COLUMN_C FROM TBL1 WHERE COLUMN_D = TBL2_SP_COLUMN_D AND ROWNUM = 1 ORDER BY COLUMN_A; IF SQLCODE = 0 THEN   :   : ELSE   :   : END IF; このような動作差異の原因としては何が考えられるでしょうか? <補足> 環境依存によるものでしょうか?(Oracleの初期化パラメータ等) それともコーディング上の問題でしょうか? べからず集などをサイトで調査中ですが、ご教示の程、宜しくお願いします。 以上です。

  • system関数を使用してJava実行(戻り値取得)

    こんにちは。 perlのsystem()関数を使用してJavaを実行し Javaの戻り値をPerlに返す。 以上の事を行いたいのですが、出来ません。 私が作成したソースと実行時のエラーを載せますので、 ご助言お願い致します。 尚、OSはLinuxです。 ----------------------- - Perl (CallTest.cgi) - ------------------------------------- #!/usr/bin/perl print "=== JavaCall START ===\n"; $Jret = "ABC"; print "PerlReturnBefore : " . $Jret . "\n"; $Jret = system("java Test"); print "PerlReturnAfter : " . $Jret . "\n"; -------------------- - Java (Test.java) - ------------------------------------- class Test { public static String main(String args[]) { String ret = "XYZ"; return ret; } } ------------ - 実行結果 - ------------------------------------- #perl CallTest.cgi === JavaCall START === PerlReturnBefore : ABC Exception in thread "main" java.lang.NoSuchMethodError: main PerlReturnAfter : 256 ------------------------------------- 期待している実行結果は === JavaCall START === PerlReturnBefore : ABC Exception in thread "main" java.lang.NoSuchMethodError: main PerlReturnAfter : XYZ です。 Javaの[public static String main]には戻り値が設定できないのでしょうか? 申し訳ありませんがご教授お願い致します。 以上の質問はPerlのカテゴリで良いのでしょうか? Javaのカテゴリにしたら良かったでしょうか? 場違いの質問でしたらスミマセン。

    • ベストアンサー
    • Perl
  • SQL*PLUSを終了させる方法

    シェルスクリプトから、SQL*PLUSを呼んでいますが、 sqlplusコマンドを実行したとき、 PL/SQLプロシージャが正常に完了しました。 SQL> と入力待ちになってしまいます。 この入力待ちで止まってほしくないのですが、 どうすればよいでしょうか。 ご教示お願いいたします。

  • SubではなくFunctionで作られる理由

    access2007を使っています。 素朴な疑問なのですがマクロを変換した時はなぜ Subプロシージャーではなく、Functionなのでしょうか? 「クエリを開く」と言うマクロを、VBAに変換したところ ******************************************************* Function マクロ1() On Error GoTo マクロ1_Err DoCmd.OpenQuery "クエリ1", acViewNormal, acEdit マクロ1_Exit: Exit Function マクロ1_Err: MsgBox Error$ Resume マクロ1_Exit End Function ******************************************************* となりました。 戻り値や返り値はないものは、FunctionプロシージャーではなくSubプロシージャーで作るものと思っていたのですが なぜ上記のコードはFunctionなのでしょうか? Functionで作る理由を教えてください。 特に意味はないのでしょうか? ちなみにFunctionをSubに書き換えて実行したら問題なくクエリが開きました。

  • ストアドプロシージャーの作成方法

    実行環境・・・CSE update文を5つ発行したくストアドプロシージャを使おうと思ったのですが上手くいかず 困っています。 create function 関数名 引数なし AS 'update文1,update文2,・・・・,update文5' language ='sql'; と行っているのですが、エラーが出てしまいます。 参考書に載っている引数ありのだと上手くいくのですが・・・ なにかやり方が間違っているのでしょうか? ご教授お願いいたします。

専門家に質問してみよう