'02.01.15 12:00:00'
não é uma data é uma string; se você estiver tentando inseri-lo em um DATE
coluna de tipo de dados, o Oracle tentará convertê-lo em uma data usando o equivalente a:SELECT TO_DATE(
'02.01.15 12:00:00',
( SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT' )
) as CHANGED
FROM DUAL
Portanto, se seu
NLS_DATE_FORMAT
O parâmetro de sessão não corresponde ao formato da sua string '02.01.15 12:00:00'
então ele irá gerar uma exceção - e isso é o que parece acontecer, pois você está recebendo ORA-01843: not a valid month
. A melhor solução é modificar seu script para converter explicitamente a string em uma data:
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;
ou para usar um literal de carimbo de data/hora:
TIMESTAMP '2015-01-02 12:00:00'
Mas você também pode criar um gatilho de logon para alterar o
NLS_DATE_FORMAT
parâmetro de sessão. Enrole o gatilho em torno deste código:ALTER SESSION SET NLS_DATE_FORMAT = 'DD.MM.YY HH24:MI:SS';
No entanto, isso alterará o formato de data usado em todas as conversões implícitas de string para data (e vice-versa), podendo interromper outras consultas que também dependem dessas conversões implícitas. Além disso, cada usuário pode alterar seus parâmetros de sessão a qualquer momento, portanto, definir esse padrão no logon depende de que eles nunca o alterem durante a sessão.
[TL;DR] Corrija seu script para não usar conversões implícitas entre tipos de dados em vez de modificar o modelo de formato usado para conversões implícitas.