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 件のコメント:
コメントを投稿