'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] Коригирайте скрипта си така, че да не използва неявни преобразувания между типове данни, вместо да модифицира модела на формат, използван за неявни преобразувания.