カタカタブログ

SIerで働くITエンジニアがカタカタした記録を残す技術ブログ。Java, Oracle Database, Linuxが中心です。たまに数学やデータ分析なども。

bash/cshでSQL*PLUS実行結果をシェル変数に格納する方法

シェルスクリプトSQL*PLUSを実行して、その結果をシェル変数に格納したいことがよくある。テーブルのデータ件数やマスタテーブルから特定のデータを引っ張りたいときなどなど。
こういうとき、sqlplusコマンドに対しSQLコードをヒアドキュメントで囲って渡す書き方をするが、bashcshではヒアドキュメントの扱いが微妙に違っていて少々嵌ったのでメモ。

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

続いてcshbash版を単純に書き換えて使うと以下だが、これだとエラーになる。

exec_sql_wrong.csh

[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