以下いくつかポイントがあります。
ポイント1:複数のSQLファイルを実行しますが、sqlplusでDBへ接続するのは一度だけ。何も考えずに書いてしまうと1SQLファイル毎にDB接続切断してしまう書き方になりますが、パーレン実行『()で囲む』する事で実現しています。
ポイント2:実行内容をログとしてspoolファイルへ出力しますが、spoolファイル名に日付をもたせています。
ポイント3:個人的に最も「ハマった」と感じたのはsqlplusをサイレントモード(-sオプション付き)で動作させると「set echo on」が効かなくなるようです。sqlplusをスクリプトに組み込む時は接続時のバナー表示など不要なのでつい-sオプションを付けるクセがついていたのですが、これをするとSQLファイル内に書いたSQL文が出力されないんですよね。(まぁ、当然と言えばとうぜんかぁ、、、)
#!/bin/bash DB_USER=sooni DB_PASS=sooni DB_HOST=vm013 DB_PORT=1521 DB_SERVICE_NAME=orau8 SQLFILE_LIST=/tmp/test/script/sqlfile.lst SPOOLDIR=/tmp/test/script/ ( echo "conn ${DB_USER}/${DB_PASS}@${DB_HOST}:${DB_PORT}/${DB_SERVICE_NAME}" echo "column logdate new_value OKIKAE" echo "select to_char(sysdate,'YYYYMMDD_HH24MISS') logdate from dual;" echo "spool ${SPOOLDIR}spool_&&OKIKAE\\.log" echo "set trimspool on" echo "set echo on" # sqlfile.lstの先頭に#を記載するとコメント行として判断する while read line ; do if [[ "${line:0:1}" != "#" ]]; then echo @${line} echo "select to_char(sysdate,'YYYY/MM/DD HH24:MI:SS') kakunin from dual;" fi done < ${SQLFILE_LIST} echo "spool off" echo "exit" ) | sqlplus /nolog res=$? echo "返却値:${res}" exit ${res}