'02.01.15 12:00:00'
není datum, je to řetězec; pokud se jej pokoušíte vložit do DATE
datový typ, pak se Oracle pokusí přetypovat na datum pomocí ekvivalentu:
SELECT TO_DATE(
'02.01.15 12:00:00',
( SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT' )
) as CHANGED
FROM DUAL
Pokud tedy váš NLS_DATE_FORMAT
parametr session neodpovídá formátu vašeho řetězce '02.01.15 12:00:00'
pak vyvolá výjimku – a to je to, co se zřejmě děje, protože dostáváte ORA-01843: not a valid month
.
Nejlepším řešením je upravit skript tak, aby explicitně přetypoval řetězec na datum:
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;
nebo použít literál časového razítka:TIMESTAMP '2015-01-02 12:00:00'
Můžete však také vytvořit spouštěč přihlášení a změnit NLS_DATE_FORMAT
parametr relace. Omotejte spoušť kolem tohoto kódu:
ALTER SESSION SET NLS_DATE_FORMAT = 'DD.MM.YY HH24:MI:SS';
Tím se však změní formát data používaný ve všech implicitních převodech z řetězce na datum (a naopak), takže může dojít k přerušení jiných dotazů, které také spoléhají na takové implicitní převody. Každý uživatel může také kdykoli změnit své parametry relace, takže nastavení tohoto výchozího nastavení při přihlášení spoléhá na to, že je během relace nikdy nezmění.
[TL;DR] Opravte svůj skript tak, aby nepoužíval implicitní převody mezi datovými typy místo úpravy modelu formátu používaného pro implicitní převody.