こんにちは、カメ助(@kamesuke_blog)です。
業務でOracleDBにデータ追加する際に、頻繁に「ORA-01861: リテラルが書式文字列と一致しません。」のエラーに遭遇します。対処方法について調べたので共有します。
この記事はこんな人にオススメ
・「ORA-01861」の原因を知りたい
・「ORA-01861」の対処方法を知りたい
OracleDBで「ORA-01861: リテラルが書式文字列と一致しません。」のエラーに遭遇した人は、ぜひ今回の記事を参考に対応してみて下さい!
ORA-01861の原因
ORA-01861のエラーは、「DBテーブルのカラムに定義したデータ型」と「SQL文に設定したパラメータのデータ型」が一致していないことが原因です。
簡単に言うと、「SQL文の値が間違っている」ことが原因です。
私の経験上、大半はプログラム内でSQL文を作成し、DBにINSERT・UPDATEする際に発生します。加えてこのエラーは、日付型の部分でよく発生します。
そのため、SQL文の日付型の部分を修正すれば解決できます。
参考:ORA-01861 – オラクル・Oracle エラー FAQ – SHIFT the Oracle
ORA-01861の対処方法
ORA-01861はSQL文の値の内、日付を扱うカラムの部分が正しくない箇所の修正で解消できます。
Oracleで日時を扱うデータ型としては以下の2つがあります。
- DATE型:年月日を扱う (例:2021-01-01)
- TIMESTAMP型:年月日+時刻を扱う(例:2021-01-01 17:16:09.765000000)
それぞれの対処方法について説明します。
動作確認環境
動作確認した環境は以下の通りです。
- Windows環境
- Oracleバージョン:18c
①カラムの定義:DATE型
DBカラムがDATE型の場合、該当の箇所を‘YYYY-MM-DD’の形式にしてください。
具体例は以下の通りです。(赤字の部分が対象箇所です。)
INSERT INTO TEST_TABLE (DATE_COLUMN) VALUES(‘2021-01-01‘);
UPDATE TEST_TABLE SET DATE_COLUMN=‘2021-01-01‘;
②カラムの定義:TIMESTAMP型
DBカラムがTIMESTAMP型の場合、該当の箇所を‘YYYY-MM-DD HH24:MI:SS.FF’の形式にしてください。
具体例は以下の通りです。(赤字の部分が対象箇所です。)
INSERT INTO TEST_TABLE (TIMESTAMP_COLUMN) VALUES(‘2021-01-01 10:00:00.000‘);
UPDATE TEST_TABLE SET TIMESTAMP_COLUMN=‘2021-01-01 10:00:00.000‘;
以上がORA-01861の対処方法でした。
まとめ
今回は、Oracleの「ORA-01861: リテラルが書式文字列と一致しません」の原因と対処方法について説明しました。
業務ではプログラム内で動的にSQLを作成し、DB更新をすることは一般的です。その際に、DBのカラムが日付型の場合に今回のエラーがよく出るので覚えておきましょう。
また、別のDBを使用する場合は日付型の扱いが多少異なる場合がありますので注意してください。
教訓:ORA-01861は、SQL文の日付部分の間違いを疑うべし!!
余談:Oracleのエラーメッセージの内容って、エラーメッセージだけでは何がエラーになっているかよく分からないですよね。。。
コメント