oracle

sqlplusから実行した外部SQLの結果を日付spoolファイルへ出力

以下いくつかポイントがあります。
ポイント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}

スポンサーリンク
コピペで使う