'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] 暗黙的な変換に使用される形式モデルを変更するのではなく、データ型間の暗黙的な変換を使用しないようにスクリプトを修正します。