開発時に発生するエラー
ORA-01843: 指定した月が無効です。
原因
Oracle 9i 以前のバージョンで動作したものを Oracle 10g に持ってきた場合などに遭遇する機会が多いと思われる。
原因は言語とテリトリの定義ファイル (NLS) の定義ファイルが仕様変更されたことによる。
日本語環境(NLS_LANGUAGE) において Oracle 9i 以前の 日付書式 MON は 'JAN' などの
英語表記であったが 10g からは日本語表記 '1月' と定義されている。
- Oracle 9i と Oracle 10g の 月(短縮)の表記の違い
対象月 | Oracle 9i | Oracle 10g |
1月 | jan | 1月 |
2月 | feb | 2月 |
3月 | mar | 3月 |
4月 | apr | 4月 |
5月 | may | 5月 |
6月 | jun | 6月 |
7月 | jul | 7月 |
8月 | aug | 8月 |
9月 | sep | 9月 |
10月 | oct | 10月 |
11月 | nov | 11月 |
12月 | dec | 12月 |
プログラムでの対応
言語が日本でかつ NLS_DATE_LANGUAGE も指定しない場合、月の指定は日本語で行なう('1月'など)
英表記を使用したい場合にはセッション単位で NLS_DATE_LANGUAGE を ENGLISH や AMERICAN に設定するか
TO_DATE の場合には
TO_DATE('01-JAN-2000','DD-MON-YYYY','NLS_DATE_LANGUAGE=AMERICAN')
のように nls_parameter の個別指定を行なう。
稼動環境での対処
ORA_NLS10 環境変数を NLS の定義ファイルを古いファイルを参照するようにする。
ただし、定義ファイルは各クライアントに配布されているものでもあるので全クライアントが対象となる。
暫定的な非常手段として用いる方がよい。
ORA_NLS10 環境変数を旧ディレクトリを指定する。Oracle 9i と同じ定義ファイルの 素データ は $ORACLE_HOME/nls/data/old にディレクトリにある。
そこに置かれている README.TXT に定義ファイルの生成方法が記されている。
(Oracle 10g R2 時点では cr9idata.pl というPERL スクリプトを実行する必要がある。)
関連事項
一覧ページへ戻る
OTN (Oracle Technology Network)によるエラーメッセージによる情報だけでは、対処に困ったエラーについてのプラクティスです。
ベスト・プラクティスというわけではないので、書いてあることに固執しないで広い視野でエラー対応してください。