以前Linux環境を想定した記事を書いたのですが、Windows環境(PowerShell)でも同様な事を実現する事があったので今回記事としました。基本的にはLinux環境と同じですが新たな発見もありました。windows環境の場合、Linux環境ではの『シェルスクリプトの終了ステータスは0~255の範囲内になる』という制限が無くなります。実際に検証してみたところ-214748364~2147483647の範囲値をpowershellで受け取れました。(どうやらint型の範囲内らしいです)Linux環境では『何かのカウント結果を返却する』という使い方はほぼできませんでしたが、Windows環境ならこれができそうですね。当然ですが0~255以外の数字を返す実装にしてしまうと「Windows用」になってしまいLinux環境へ持っていけなくなるのでご注意ください。
1.以下の内容でSQLファイル(test.sql)を作成します
SQLファイルはShift_JISで作成してください。
set feedback off set serveroutput on var rsts NUMBER; declare begin -- PowerShellの場合bashと異なり255を超えた値でもOK select 2147483647 into :rsts from dual; --dbms_output.put_line('rsts:'||:rsts ); end; / exit :rsts;
2.sqlplusの実行
PowerShellからsqlplusへ外部SQLファイルを渡す場合「@」を含めて『ダブルクォーテーション』もしくは『シングルクォーテーション』で囲む必要があります。PowerShellでは「@」に特別な意味(配列宣言で利用します)があるためです。蛇足ですが同じWindows環境でもdos窓で利用する際はこの囲みは不要です。
## @を使いSQLファイルを指定する方法
PS C:\temp\sample01> sqlplus -s sooni/sooni@vm013/orau8 '@test.sql'
PS C:\temp\sample01> echo $LastExitCode
2147483647
## Get-contentコマンドレットでSQLを渡す方法(値を-2147483648に書き換えました)
PS C:\temp\sample01> get-content test.sql | sqlplus -s sooni/sooni@vm013/orau8
PS C:\temp\sample01> echo $LastExitCode
-2147483648
##
PS C:\temp\sample01> get-content test.sql | sqlplus -s sooni/sooni@vm013/orau8
PS C:\temp\sample01> echo $?
False
sqlplusの終了コードは$LastExitCodeに入ってきます。powershellでも「$?」が利用できますがこちらはLinuxの場合と動作が違いTrue/Falseとなります。
おまけ dos窓でも実行してみます
dos窓ではsqlplusの戻り値は「 %ERRORLEVEL% 」に入っています。
C:\temp\sample01>type test.sql
set feedback off
set serveroutput on
var rsts NUMBER;
declare
begin
select -2147483648 into :rsts from dual;
end;
/
exit :rsts;
C:\temp\sample01>sqlplus -s sooni/sooni@vm013/orau8 @test.sql
C:\temp\sample01>echo %ERRORLEVEL%
-2147483648
C:\temp\sample01>