開発時に発生するエラー

ORA-01843: 指定した月が無効です。

原因

Oracle 9i 以前のバージョンで動作したものを Oracle 10g に持ってきた場合などに遭遇する機会が多いと思われる。
原因は言語とテリトリの定義ファイル (NLS) の定義ファイルが仕様変更されたことによる。
日本語環境(NLS_LANGUAGE) において Oracle 9i 以前の 日付書式 MON は 'JAN' などの 英語表記であったが 10g からは日本語表記 '1月' と定義されている。

  • Oracle 9i と Oracle 10g の 月(短縮)の表記の違い
    対象月Oracle 9iOracle 10g
    1月jan1月
    2月feb2月
    3月mar3月
    4月apr4月
    5月may5月
    6月jun6月
    7月jul7月
    8月aug8月
    9月sep9月
    10月oct10月
    11月nov11月
    12月dec12月

プログラムでの対応

言語が日本でかつ 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)によるエラーメッセージによる情報だけでは、対処に困ったエラーについてのプラクティスです。
ベスト・プラクティスというわけではないので、書いてあることに固執しないで広い視野でエラー対応してください。

ORA-01843の関連トピックス

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle のライセンスがわからない…
Oracle Direct (ネットで聞いても最後はここで要確認)