- - PR -
シェルからのPL/SQLプロシージャ−呼び出し
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-01-18 14:09
シェルからOracle PL/SQLで作成したプロシージャーの呼び出した時に
OUTパラメータをシェルに返す方法がわかりません。 ≪プロシージャー本体≫----------- CREATE OR REPLACE PROCEDURE db.sp_test( FILE_NAME IN VARCHAR2, -- ファイル名 LOG_FNAME IN VARCHAR2, -- ログファイル名 RET OUT NUMBER -- 復帰コード ) IS BEGIN ..... EXCEPTION ... END; / ----------ここまで 上記プロシージャ−を下記のシェルから呼び出そうとしています。 ≪呼び出し元のシェル≫−−−−−−−−− #!/bin/csh clear echo "" echo " 処理開始します" echo -n " よろしいですか?(y/n)" set answer = $< if($answer == 'y') then #入力引数定義 set log_fname1 = "'proc_1.log'"; set test_fname1 = "'test_CONV_1.tsv'"; echo $test_fname1 echo $log_fname1 sqlplus db/db <<++ >> /dev/null -- テスト@ spool test_spool.log VAR R NUMBER; exec sp_test( FILE_NAME => $test_fname1, LOG_FNAME =>$log_fname1, RET => :R); -- @ PRINT R spool off ++ set $ret = R; -- これはだめでした -- テストA spool test_spool.log exec sp_test( FILE_NAME => $test_fname1, LOG_FNAME =>$log_fname1, RET => :$ret); -- A spool off ++ endif -------------------ここまで テスト@の方法で実行するとRには正常な値が入っています(スプールファイルtest_spool.logに入っています)。 しかし、これをシェル側へ返したいので、Aの方法でやってみると、「$retは未定義です」 というエラーをシェルが返してきて、プロシージャ−は実行できません。 どなたかストアドプロシージャ−の出力パラメータを シェルで受け取る方法をご存知の方は教えてください。 よろしくお願いします。 | ||||
|
投稿日時: 2006-01-18 14:27
SQL*Plus の終了時に
...って指定してもだめですかね。 _________________ もしもし@RMAN 友の会 | ||||
|
投稿日時: 2006-01-18 17:54
もしもしさん、さっそくのご回答ありがとうございます。
しかし、 SQL*Plusの最後に exit :R としてから、 シェル側に戻ってきてから echo $R としても echo R としても echo :R としても Rを変数として入っているべき値は出力されませんでした。。。 | ||||
|
投稿日時: 2006-01-19 11:38
もしかしたら私勘違いしていたかもしれない...。 exit :r は SQL*Plus の終了ステータスを指定するものだったから、 echo $r ではなくて、echo $status とか echo $? の類になるのでは。 だいいち、"R" はシェルで定義した変数ではないですし。 # csh なら echo $status になる? # $? は sh を使用する場合みたい。 _________________ もしもし@RMAN 友の会 [ メッセージ編集済み 編集者: もしもし 編集日時 2006-01-19 11:43 ] | ||||
|
投稿日時: 2006-01-19 18:15
いろいろやってみましたが、どうにもこうにもならなかったので、
変数Rは出力パラメータにせず、ストアドプロシージャ−内で ファイルに出力し、シェル側でそのファイルをcatし、 結果を変数にとることにしました。 もしもしさん、いろいろありがとうございました。 |
1