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

ORA-1843:niepoprawny miesiąc podczas aktualizacji rekordu

Data nie ma formatu – jest przechowywana wewnętrznie w bazie danych jako 7-bajtów (reprezentujące rok, miesiąc, dzień, godzinę, minutę i sekundę) i dopiero wtedy, gdy używany interfejs użytkownika (tj. SQL/Plus, SQL Developer, Java itp.) nie spróbuje go wyświetlić użytkownikowi i dokona konwersji w coś, co uznasz za sensowne (zazwyczaj ciąg), że data ma format.

Jeśli podajesz sformatowaną datę do procedury, będzie to ciąg i Oracle spróbuje niejawnie rzutować ją na datę, używając NLS_DATE_FORMAT parametr sesji:

UPDATE your_table
SET your_date_column = '18-06-14'; -- or equivalently via a bind parameter

Jest domyślnie konwertowane na

UPDATE your_table
SET your_date_column = TO_DATE(
                         '18-06-14',
                         ( SELECT value
                           FROM   NLS_SESSION_PARAMETERS
                           WHERE  parameter = 'NLS_DATE_FORMAT' )
                       );

Jeśli NLS_DATE_FORMAT nie pasuje, Oracle zgłosi wyjątek (a parametr może być ustawiony przez każdego użytkownika, więc nie powinieneś polegać na tym, że jest spójny - szczególnie w organizacjach międzynarodowych, gdy domyślny format daty zależy od twojego terytorium i języka).

Jeśli aktualizujesz wartość, użyj DATE literał, a nie ciąg:

UPDATE your_table
SET your_date_column = DATE '2014-06-18';

Lub jawnie przekonwertuj ciąg i podaj model formatu:

UPDATE your_table
SET your_date_column = TO_DATE( '18-06-14', 'DD-MM-RR' );

To samo dotyczy przekazywania parametrów do funkcji. Użyj DATE dosłowny:

BEGIN
  your_procedure(
    p_launch_date => DATE '2014-06-18'
  );
END;
/

lub jawnie przekonwertuj ciąg na datę (i nie polegaj na niejawnej konwersji):

BEGIN
  your_procedure(
    p_launch_date => TO_DATE( '18-06-14', 'DD-MM-RR' )
  );
END;
/



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JDBC :zwracanie wielu zestawów wyników za pomocą jednego wywołania bazy danych - nie działa w przypadku Oracle

  2. Tworzenie listy wartości oddzielonych przecinkami w instrukcji Oracle SQL

  3. Jak zwrócić zestaw wyników z okna zapytania w Oracle SQL Developer?

  4. Jak zgłosić wyjątek w PL/SQL?

  5. jak działają procedury składowane Oracle (z kursorami)?