Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

cx_Oracle 'ORA-01843:não é um mês válido' com parâmetro unicode


Na verdade é um bug no Oracle 10.5.0.2 e 11.2.0.1.

Bug pode ser reproduzido da seguinte forma:

defina NLS_TIMESTAMP_FORMAT na sessão.

Execute qualquer conversão TO_DATE implícita ou explícita com dados unicode.

O próximo TO_TIMESTAMP implícito ou explícito com dados unicode acionará a redefinição interna do formato de carimbo de data/hora.

Todos os TO_TIMESTAMP consecutivos falharão e TO_CHAR de timestamp produzirá uma saída inválida.

Aqui está o código para testar o comportamento:
ALTER SESSION SET NLS_TERRITORY = 'AMERICA';
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS' NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';

REM --- WORKS:
SELECT TO_TIMESTAMP('2013-06-24 18:15:10.312') FROM DUAL;

REM --- WORKS:
SELECT TO_DATE('2013-06-24 18:15:10') FROM DUAL;

REM --- WORKS:
SELECT TO_TIMESTAMP('2013-06-24 18:15:10.312') FROM DUAL;

REM --- WORKS:
SELECT TO_TIMESTAMP(x) FROM (SELECT CAST('2013-06-24 18:15:10.312' AS NVARCHAR2(30)) AS X FROM DUAL);

REM --- WORKS:
SELECT TO_DATE(x) FROM (SELECT CAST('2013-06-24 18:15:10' AS NVARCHAR2(30)) AS X FROM DUAL);

REM --- WORKS:
SELECT TO_TIMESTAMP('2013-06-24 18:15:10.312') FROM DUAL;

REM !!! FAILS!
SELECT TO_TIMESTAMP(x) FROM (SELECT CAST('2013-06-24 18:15:10.312' AS NVARCHAR2(30)) AS X FROM DUAL);

REM !!! FAILS!
SELECT TO_TIMESTAMP('2013-06-24 18:15:10.312') FROM DUAL;

REM --- WORKS:
SELECT TO_DATE('2013-06-24 18:15:10') FROM DUAL;