【Oracle】「ORA-01861: リテラルが書式文字列と一致しません」は日付部分を疑え!

こんにちは、カメ助(@kamesuke_blog)です。

業務でOracleDBにデータ追加する際によく「ORA-01861: リテラルが書式文字列と一致しません。」のエラーに遭遇します。対処方法について調べたので共有します。

カメ助

この記事はこんな人にオススメ
・「ORA-01861」の原因を知りたい
「ORA-01861」の対処方法を知りたい

Oracleの「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つがあります。

Oracleの日付を扱うデータ型
  • DATE型:年月日を扱う (例:2021-01-01)
  • TIMESTAMP型:年月日+時刻を扱う(例:2021-01-01 17:16:09.765000000)

それぞれの対処方法について説明します。

動作確認環境

動作確認した環境は以下の通りです。

  • Windows環境
  • Oracleバージョン:18c

①カラムの定義:DATE型

DBカラムがDATE型の場合、該当の箇所を‘YYYY-MM-DD’の形式にしてください。

具体例は以下の通りです。(赤字の部分が対象箇所です。)

INSERT文の例

INSERT INTO TEST_TABLE (DATE_COLUMN) VALUES(‘2021-01-01‘);

UPDATE文の例

UPDATE TEST_TABLE SET DATE_COLUMN=‘2021-01-01‘;

②カラムの定義:TIMESTAMP型

DBカラムがTIMESTAMP型の場合、該当の箇所を‘YYYY-MM-DD HH24:MI:SS.FF’の形式にしてください。

具体例は以下の通りです。(赤字の部分が対象箇所です。)

INSERT文の例

INSERT INTO TEST_TABLE (TIMESTAMP_COLUMN) VALUES(‘2021-01-01 10:00:00.000‘);

UPDATE文の例

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のエラーメッセージの内容って、エラーメッセージだけでは何がエラーになっているかよく分からないですよね。。。

SQLの勉強にはこの本がオススメですよ。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!

この記事を書いた人

大阪でITエンジニアしています。(8年目に突入)
趣味でウェブサイトに関することをいろいろと勉強しています。

勉強した内容やプログラミングに関する情報を中心に役立つ情報を発信するべく日々ブログを更新しています。

3度の飯よりも「柿の種」をこよなく愛する関西人。

コメント

コメントする

目次
閉じる