Pages

2013年10月1日火曜日

cronとORA-01861

groovyを実行してDBからデータを引っ張ってくるというシェルスクリプトを書いたんですが、このスクリプトをcronで実行すると

ORA-01861: literal does not match format string

というエラーが発生。
もちろん、cronを通さず実行すると特に問題なく動作する。

実際にエラーが発生している箇所を見ると

SELECT xxxx (省略) WHERE ADMIT_DATE < TO_DATE('20131001', 'YYYYMMDD')

こんな感じのSQLを実行している箇所で、Oracleのエラーは

「文字列と日付を比較すんな」

って感じのエラー。
これが、何でcronからの実行時にだけ発生するのか原因が分からずハマリました。


で、まぁ原因なんですが文字コードなんですよね。

スクリプトで環境変数のLANGをログに出すようにして実行(cronを通さずに実行)すると、

LANG="ja_JP.UTF-8"

なんですよ。
で、cronでスクリプトを実行するとLANGには何も設定されてなかったんですね。

通常ユーザでは、
何も設定していない場合は
/etc/sysconfig/i18n
に設定されているOSの文字コードが引き継がれるらしいんですけど(.bashrcとかに書いてたらそっち見ますけど)、どうやらcronではユーザの環境変数を引き継がないみたい。

何か設定があるかもしれませんが。。。

なので、cronでも文字コードを同じようにするために以下の行をスクリプトに追加

export LANG=ja_JP.UTF-8

無事にcronから動きましたとさ。


0 件のコメント:

コメントを投稿