SQLを定期的に等間隔で実行する方法(Linux-while)
対応バージョン
Oracle Linux 6
2016-06-15記事公開
LinuxやUnixにて等間隔に繰り返しSQLを実行したい場合、OSの機能を利用してSQLのループ処理をすることが可能です。
cronなどを利用することもできますが、お手軽にできる方法としてwhileループを利用する方法があります。
Linuxでのwhileループ実行例
ループコマンド
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ ORACLE_SID=orcl $ NLS_DATE_FORMAT="yyyy/mm/dd hh24:mi:ss" $ export ORACLE_SID NLS_DATE_FORMAT $ while true > do > echo "set pagesize 1000 linesize 1000 trim on tab off feedback off" > echo "select sysdate from dual;" > sleep 5 > done | sqlplus -L -s / as sysdba SYSDATE ------------------- 2016/06/15 18:04:36 SYSDATE ------------------- 2016/06/15 18:04:41 SYSDATE ------------------- 2016/06/15 18:04:46 ..... |
ループ実行の仕組み
SQL*Plusでは標準入力を受け付けた場合、そのSQLの実行をします。
ここではwhileでのループ時にechoした内容が標準出力として出力され、パイプ(|)を通してsqlplusに渡されています。
sqlplusに-Lと-sオプションを指定していますが、ここでの動作とは無関係です。(sqlplusの-Lはログイン失敗時のユーザ名の再入力リクエストをなくします。-sはプロンプト(SQL>)やログイン時のメッセージを出力しません。)
他にsqlplusへの標準入力の渡し方は以下のような方法があります。
パイプを使用する(catを使用した方法)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ # ファイルの内容を確認する $ cat test.sql alter session set nls_date_format='yyyy/mm/dd hh24:mi:ss'; select sysdate from dual; exit $ # ファイルの内容をsqlplusへ渡して実行する $ cat test.sql | sqlplus -s / as sysdba Session altered. SYSDATE ------------------- 2016/06/15 18:28:33 1 row selected. |
ファイルの内容を直接リダイレクションで渡す
1 2 3 4 5 6 7 8 9 10 11 |
$ sqlplus -s / as sysdba < test.sql Session altered. SYSDATE ------------------- 2016/06/15 18:28:33 1 row selected. |
ヒアドキュメントを使用する
SQLEOFに挟まれた文を実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ sqlplus -s / as sysdba << SQLEOF > alter session set nls_date_format='yyyy/mm/dd hh24:mi:ss'; > select sysdate from dual; > exit > SQLEOF Session altered. SYSDATE ------------------- 2016/06/15 18:30:17 1 row selected. |