sql >> Databasteknik >  >> RDS >> Oracle

cx_Oracle 'ORA-01843:inte en giltig månad' med unicode-parameter

Det är faktiskt en bugg i Oracle 10.5.0.2 och 11.2.0.1.

Bug kan reproduceras enligt följande:

ställ in NLS_TIMESTAMP_FORMAT i session.

Kör valfri implicit eller explicit TO_DATE-konvertering med unicode-data.

Nästa implicita eller explicita TO_TIMESTAMP med unicode-data kommer att utlösa intern återställning av tidsstämpelformat.

Alla på varandra följande TO_TIMESTAMP kommer att misslyckas och TO_CHAR av tidsstämpeln kommer att producera ogiltig utdata.

Här är koden för att testa beteende:

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;


  1. ORACLE PL/SQL-proceduren kräver AUTHID CURRENT_USER för EXECUTE IMMEDIATE med DDL

  2. Hur kan jag veta hur många frågor som skickas i min databas?

  3. SMO ConnectionContext.StatementTimeout-inställningen ignoreras

  4. []sträng till jsonb med Gorm och postgres