sql >> データベース >  >> RDS >> Oracle

LiquibaseスクリプトはORA-01843を返します:有効な月ではありません

    '02.01.15 12:00:00' 日付ではなく文字列です。 DATEに挿入しようとしている場合 データ型列の場合、Oracleは次と同等の日付を使用して列をキャストしようとします。

    SELECT TO_DATE(
             '02.01.15 12:00:00',
             ( SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT' )
           ) as CHANGED
    FROM   DUAL
    

    したがって、NLS_DATE_FORMAT セッションパラメータが文字列の形式と一致しません'02.01.15 12:00:00' 次に、例外が発生します。これは、ORA-01843: not a valid monthを取得しているために発生しているように見えます。 。

    最善の解決策は、スクリプトを変更して、文字列を日付に明示的にキャストすることです。

    MERGE INTO A config
    USING (
      SELECT 100 as id,
             TO_DATE( '02.01.15 12:00:00', 'DD.MM.YY HH24:MI:SS' ) as CHANGED,
             0 as DELETED,
             1 as B
      FROM   DUAL
    ) src ON (src.id = config.id)
    WHEN NOT MATCHED THEN 
      INSERT(id,CHANGED, DELETED, B) VALUES(src.id, src.CHANGED, src.DELETED, src.B)
    WHEN MATCHED THEN
      UPDATE SET config.B = src.B;
    

    またはタイムスタンプリテラルを使用するには:TIMESTAMP '2015-01-02 12:00:00'

    ただし、ログオントリガーを作成して、NLS_DATE_FORMATを変更することもできます。 セッションパラメータ。このコードの周りにトリガーをラップします:

    ALTER SESSION SET NLS_DATE_FORMAT = 'DD.MM.YY HH24:MI:SS';
    

    ただし、これにより、すべての暗黙的な変換で使用される日付形式が文字列から日付に(またはその逆に)変更されるため、このような暗黙的な変換に依存する他のクエリが破損する可能性があります。また、各ユーザーはいつでもセッションパラメータを変更できるため、ログオン時にこのデフォルトを設定することは、セッション中に変更しないことに依存しています。

    [TL; DR] 暗黙的な変換に使用される形式モデルを変更するのではなく、データ型間の暗黙的な変換を使用しないようにスクリプトを修正します。



    1. ユーザー入力をサニタイズするために他に何をすべきですか?

    2. MySQLODBC5.1ドライバーが誤ったデータ型をADODBに返す

    3. データ変更の効果的な管理

    4. OracleでTimestamp_to_scnとScn_to_timestampを使用するにはどうすればよいですか?