Oracle
 sql >> Datenbank >  >> RDS >> Oracle

cx_Oracle 'ORA-01843:kein gültiger Monat' mit Unicode-Parameter

Es ist eigentlich ein Fehler in Oracle 10.5.0.2 und 11.2.0.1.

Fehler kann wie folgt reproduziert werden:

setze NLS_TIMESTAMP_FORMAT in der Sitzung.

Führen Sie jede implizite oder explizite TO_DATE-Konvertierung mit Unicode-Daten durch.

Das nächste implizite oder explizite TO_TIMESTAMP mit Unicode-Daten löst das interne Zurücksetzen des Zeitstempelformats aus.

Alle aufeinander folgenden TO_TIMESTAMP schlagen fehl und TO_CHAR des Zeitstempels erzeugt eine ungültige Ausgabe.

Hier ist der Code zum Testen des Verhaltens:

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;