SQL*Plusの戻り値をシェルへ返却する方法
プロシージャの実行結果ステータスをシェルに返したくなるシーンがありますが、SQL*Plusの戻り値を使う事でこれを実現できます。私はLinux環境でのバッチ処理で使っています。
(先日Windows環境においても(PowerShell)同様な事を行う事となったのでこちらで検証してみました。Linux環境とは少し挙動がかわりますご興味のある方はどうぞ。)
1.以下の内容でSQLファイル(test.sql)を作成します
set feedback off set serveroutput on var rsts NUMBER; declare begin select 10 into :rsts from dual; end; / exit :rsts;
2.不要な情報を表示させないようsqlplusをサイレントモード(-s)で実行します
※シェルの戻り値は0~255の範囲なので実装の際にはご注意ください。
$ sqlplus -s sooni/sooni@vm013/pdborcl < test.sql
$ echo $?
10
SQL*Plusから文字列を渡したい場合どうするか
SQL*PlusのEXITコマンドは残念な事に文字列の返却はできず、数字のみに限定されています。もしどうしてもプロシージャからシェルへ文字列を渡したい場合以下のような方法で実現できます。これは「戻り値」ではなく、標準出力経由で渡しています。
1.以下の内容でSQLファイル(test2.sql)を作成します。
set feedback off set serveroutput on var rvst VARCHAR2(80); declare begin select '文字列返却' into :rvst from dual; --標準出力 dbms_output.put_line('rvst:'||:rvst ); end; / --exit SUCCESS; --exit FAILURE; exit WARNING;
2.sqlplusの実行
外部ファイルに記載したSQLをsqlplusで実行する場合、「@」で指定する方法がメジャーだと思いますが、パラメータがない場合はcatコマンドで代替する事もできます。
[oracle@vm013 ~]$ RST=`cat test2.sql | sqlplus -s sooni/sooni@vm013/orau8`
[oracle@vm013 ~]$ echo $?
2
[oracle@vm013 ~]$ echo $RST
rvst:文字列返却
[oracle@vm013 ~]$
exit SUCCESS で0、FAILUREで1、WARNINGで2を終了ステータスコードとして返却してくれます。