LoginSignup
18
24

More than 5 years have passed since last update.

シェルスクリプト内でsqlplusを実行する

Posted at

ヒアドキュメントで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

18
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
24