ヒアドキュメントでsqlplusを実行する
# !/bin/bash
sqlplus -s / as sysdba <<EOF
select instance_name,status from v\$instance;
exit
EOF
exit
シェル内にSQL文が直接書かれているため、らくちん。見通しもいい。
v$instnceの「$instance」部分が変数として展開されないように[$]でエスケープしている。
以下のように`EOF` とすることでヒアドキュメント内での展開をしないようにすることもできる。
# !/bin/bash
sqlplus -s / as sysdba <<'EOF'
select instance_name,status from v$instance;
exit
EOF
exit
SQLファイルをシェルの中で作ってsqlplusを実行する
# !/bin/bash
tempsqlfile=/tmp/tempsqlpfile.sql
touch ${tempsqlfile}
echo "select instance_name,status from v\$instance;" > ${tempsqlfile}
echo "exit" >> ${tempsqlfile}
sqlplus -s / as sysdba @${tempsqlfile}
exit
実行したSQLファイルを残しておきたかったり、シェル内の条件によって生成するSQLが変わってくる場合に使用。
行数が多くて、SQLファイルへのリダイレクト(「>>ファイル名」)を毎行書きたくないときはコマンドをグループ化する。
{
echo "select instance_name,status from v\$instance;"
echo "exit"
} > ${tempsqlfile}
もちろんヒアドキュメントでファイルを作ることも可能。
cat <<'EOF' > ${tempsqlfile}
select instance_name,status from v$instance;
exit
EOF
パイプで渡してsqlplusを実行する
# !/bin/bash
(
echo "select instance_name,status from v\$instance;"
echo "exit"
)|sqlplus -s / as sysdba
exit
sqlplusのコネクションを1回だけ生成し、定期的にSQLを発行するような場合に使う。
以下は1回の接続でフラグファイルが存在する間、定期的に同じSQLを発行し続ける例。
# !/bin/bash
sql_alive_flg=/tmp/sql_alive.flg
touch $sql_alive_flg
(
while [ -a ${sql_alive_flg} ]
do
echo "select instance_name,status from v\$instance;"
sleep 5
done
echo "exit"
)|sqlplus -s / as sysdba
exit
参考
書籍:門外不出のOracle現場ワザ
http://www.oracle.com/technetwork/jp/articles/chapter5-1-101584-ja.html
SQL*Plus使い方 - SQLスクリプトをシェルスクリプト内に書く(シェルスクリプトTips-3)
https://blogs.oracle.com/oracle4engineer/sqlplus-sqltips-3
bashのヒアドキュメントを活用する
https://qiita.com/take4s5i/items/e207cee4fb04385a9952