bash/cshでSQL*PLUS実行結果をシェル変数に格納する方法
シェルスクリプトでSQL*PLUSを実行して、その結果をシェル変数に格納したいことがよくある。テーブルのデータ件数やマスタテーブルから特定のデータを引っ張りたいときなどなど。
こういうとき、sqlplusコマンドに対しSQLコードをヒアドキュメントで囲って渡す書き方をするが、bashとcshではヒアドキュメントの扱いが微妙に違っていて少々嵌ったのでメモ。
bash
bashだとよくやるのはこういう書き方。SQL*PLUSコマンドにヒアドキュメントでsql文を渡し、全体をバッククオート(`)で囲んでいる。
exec_sql.sh
[oracle@localhost dev]$ cat exec_sql.sh #!/bin/bash ret=`sqlplus -s / as sysdba << END set head off; select sysdate from dual; exit; END` echo $ret
こうやるとsysdateを変数に格納することができる。
[oracle@localhost dev]$ ./exec_sql.sh 24-AUG-14
csh
続いてcsh。bash版を単純に書き換えて使うと以下だが、これだとエラーになる。
[oracle@localhost dev]$ cat exec_sql_wrong.csh #!/bin/csh -f set ret=`sqlplus -s / as sysdba << END set head off; select sysdate from dual; exit; END` echo $ret
実行すると、以下のようにバッククオート(`)の扱いが違うためエラーになってしまう。
[oracle@localhost dev]$ ./exec_sql_wrong.csh ` が対応しません.
cshでは、以下のようにバッククオートはヒアドキュメントの手前で閉じるようにする。これだとうまくいく。
[oracle@localhost dev]$ cat exec_sql.csh #!/bin/csh -f set ret=`sqlplus -s / as sysdba` << END set head off; select sysdate from dual; exit; END echo $ret
これを実行すると、bashと同じようにSQL*PLUSの実行結果を変数に格納することができる。
[oracle@localhost dev]$ ./exec_sql.csh 24-AUG-14