[CentOS] OracleのSQL文をcronでスケジュール実行する

    

実行するSQL文を作成する

少し複雑な処理も実装できるように、無名関数を利用してみたいと思います。

/home/oracle/test.sql

SET SERVEROUT ON

DECLARE
BEGIN
  -- 標準出力へ文字列を出力
  DBMS_OUTPUT.PUT_LINE( 'hello world' );
  -- ここにDML文を記述(INSERT/UPDATE/DELETE等)
EXCEPTION
  WHEN OTHERS THEN
  NULL;
END;
/

―― SELECT文を読んでみる
select sysdate from dual;

exit

無名ブロック

上のサンプルのDECLARE~ENDまでの部分はPL/SQLの無名ブロックです。
「Hello world」を表示するだけの処理となっていますが、本来はここに例えば集計処理等に用いるSQLを記述することができます。1行目のSET句は標準出力への出力をONにするという意味です。

SELECT文の実行

更新処理が必要なくSQLの結果をログに定期的に記録しておきたいというような要件であれば、無名ブロックを使用せずに直接SQL文を記述することができます。上の例ではシステム日付を表示させています。

exit句

exit句を明示的に定義することでSQLPlusを終了させます。スケジューリング処理に使用する場合は必ずいれておきましょう。
※ 無名ブロックに更新処理等を記述した場合、必ず例外が発生した場合exitを通るようにしましょう。

シェルスクリプトを作成する

SQLを起動するためのシェルスクリプトを作成しておきます。
/home/oracle/test.sh

#!/bin/bash -l

sqlplus id/password@接続先 @/home/oracle/test.sql

ここで注目は先頭の宣言ですが、「#!/bin/bash -l」としています。スケジュール実行しようとcrondに登録した場合ユーザの環境変数が読み込まれないために「コマンドが見つからない」などのエラーとなる場合があります。-lオプションを付与することでログイン時と同じ環境変数を使用できるようにしておきます。
2行目はsqlplusを用いて先ほど作成したSQLを実行する定義になります。接続先情報は環境に応じて適宜変更します。DBサーバの接続パスが記述されているので、ファイルの権限や置き場所には十分注意しましょう。

スケジュールタスクとしてcrondに登録する

今回は毎日0:00にoracleユーザとして先ほど作成したSQL文を実行するものとします。
oracleユーザで下記のコマンドを実行します。

crontab -e

そして下記の記述を定義します。

0 0 * * *  /home/oracle/tests.sh 1>/dev/null 2>/dev/null

実行するたびに結果がoracleユーザにメール通知がくるので「1>/dev/null 2>/dev/null」と記述することで破棄します。結果をログとして保存する場合は/dev/nullのかわりに保存先パスを記述するとよいでしょう。