'02.01.15 12:00:00'
bukan tanggal itu adalah string; jika Anda mencoba memasukkannya ke dalam DATE
kolom tipe data maka Oracle akan mencoba mentransmisikannya ke tanggal menggunakan yang setara dengan:
SELECT TO_DATE(
'02.01.15 12:00:00',
( SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT' )
) as CHANGED
FROM DUAL
Jadi jika NLS_DATE_FORMAT
Anda parameter session tidak cocok dengan format string Anda '02.01.15 12:00:00'
maka itu akan menimbulkan pengecualian - dan inilah yang tampaknya terjadi karena Anda mendapatkan ORA-01843: not a valid month
.
Solusi terbaik adalah memodifikasi skrip Anda untuk secara eksplisit mentransmisikan string ke tanggal:
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;
atau untuk menggunakan stempel waktu literal:TIMESTAMP '2015-01-02 12:00:00'
Tetapi Anda juga dapat membuat pemicu masuk untuk mengubah NLS_DATE_FORMAT
parameter sesi. Bungkus pemicu di sekitar kode ini:
ALTER SESSION SET NLS_DATE_FORMAT = 'DD.MM.YY HH24:MI:SS';
Namun, ini akan mengubah format tanggal yang digunakan di semua konversi implisit dari string ke tanggal (dan sebaliknya) sehingga dapat merusak kueri lain yang juga bergantung pada konversi implisit tersebut. Selain itu, setiap pengguna dapat mengubah parameter sesi mereka kapan saja sehingga pengaturan default ini saat masuk bergantung pada mereka yang tidak pernah mengubahnya selama sesi mereka.
[TL;DR] Perbaiki skrip Anda agar tidak menggunakan konversi implisit antar tipe data daripada memodifikasi model format yang digunakan untuk konversi implisit.