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

Skrypt Liquibase zwraca ORA-01843:niepoprawny miesiąc

'02.01.15 12:00:00' to nie data to ciąg znaków; jeśli próbujesz wstawić go do DATE kolumna typu danych, Oracle spróbuje rzutować ją na datę, używając odpowiednika:

SELECT TO_DATE(
         '02.01.15 12:00:00',
         ( SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT' )
       ) as CHANGED
FROM   DUAL

Więc jeśli Twój NLS_DATE_FORMAT parametr sesji nie pasuje do formatu ciągu '02.01.15 12:00:00' wtedy zgłosi wyjątek - i wydaje się, że tak się dzieje, ponieważ otrzymujesz ORA-01843: not a valid month .

Najlepszym rozwiązaniem jest zmodyfikowanie skryptu tak, aby jawnie rzutował ciąg na datę:

MERGE INTO A config
USING (
  SELECT 100 as id,
         TO_DATE( '02.01.15 12:00:00', 'DD.MM.YY HH24:MI:SS' ) as CHANGED,
         0 as DELETED,
         1 as B
  FROM   DUAL
) src ON (src.id = config.id)
WHEN NOT MATCHED THEN 
  INSERT(id,CHANGED, DELETED, B) VALUES(src.id, src.CHANGED, src.DELETED, src.B)
WHEN MATCHED THEN
  UPDATE SET config.B = src.B;

lub użyć literału znacznika czasu:TIMESTAMP '2015-01-02 12:00:00'

Ale możesz również utworzyć wyzwalacz logowania, aby zmienić NLS_DATE_FORMAT parametr sesji. Owiń wyzwalacz wokół tego kodu:

ALTER SESSION SET NLS_DATE_FORMAT = 'DD.MM.YY HH24:MI:SS';

Spowoduje to jednak zmianę formatu daty używanego we wszystkich niejawnych konwersjach z ciągu na datę (i odwrotnie), więc może przerwać inne zapytania, które również opierają się na takich niejawnych konwersjach. Ponadto każdy użytkownik może zmienić swoje parametry sesji w dowolnym momencie, więc ustawienie tej wartości domyślnej przy logowaniu polega na tym, że nigdy nie zmienią go podczas sesji.

[TL;DR] Napraw swój skrypt, aby nie używał niejawnych konwersji między typami danych, zamiast modyfikować model formatu używany do niejawnych konwersji.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SSIS nie może zapisać pakietów i ponownie uruchamia program Visual Studio

  2. Czy BigQuery obsługuje natychmiastowe wykonanie polecenia, aby uruchomić dynamiczne zapytanie?

  3. Nazwa kolumny rozpoczynająca się cyfrą?

  4. instrukcja sqlplus z wiersza poleceń

  5. Jak skonfigurować serwer WebLogic Server w istniejącym środowisku Eclipse