Oracle
 sql >> Baza danych >  >> RDS >> Oracle

cx_Oracle 'ORA-01843:niepoprawny miesiąc' z parametrem Unicode

W rzeczywistości jest to błąd w Oracle 10.5.0.2 i 11.2.0.1.

Błąd można odtworzyć w następujący sposób:

ustaw NLS_TIMESTAMP_FORMAT w sesji.

Uruchom dowolną niejawną lub jawną konwersję TO_DATE z danymi Unicode.

Następne niejawne lub jawne TO_TIMESTAMP z danymi Unicode spowoduje wewnętrzne zresetowanie formatu znacznika czasu.

Wszystkie kolejne TO_TIMESTAMP zakończą się niepowodzeniem, a TO_CHAR znacznika czasu da nieprawidłowe wyjście.

Oto kod do testowania zachowania:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Połącz bazę danych MS SQL Server z bazą danych Oracle 11g

  2. Czy istnieje sposób na ulepszenie zapytania MERGE?

  3. Spór o sekwencję RAC

  4. Wywołanie zapisanej PROCEDURY w Toad

  5. EntityFramework Code First Oracle