Oracle
 sql >> база данни >  >> RDS >> Oracle

Скриптът Liquibase връща ORA-01843:невалиден месец

'02.01.15 12:00:00' не е дата, а е низ; ако се опитвате да го вмъкнете в DATE колона тип данни, тогава Oracle ще се опита да го преобразува към дата, използвайки еквивалента на:

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

Така че, ако вашият NLS_DATE_FORMAT параметърът на сесията не съответства на формата на вашия низ '02.01.15 12:00:00' след това ще предизвика изключение - и това е, което изглежда се случва, тъй като получавате ORA-01843: not a valid month .

Най-доброто решение е да модифицирате скрипта си, за да прехвърлите изрично низа към дата:

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;

или да използвате литерал на клеймо за време:TIMESTAMP '2015-01-02 12:00:00'

Но можете също така да създадете тригер за влизане, за да промените NLS_DATE_FORMAT параметър на сесията. Обвийте тригера около този код:

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

Това обаче ще промени формата на датата, използван във всички неявни преобразувания от низ към дата (и обратно), така че може да наруши други заявки, които също разчитат на такива неявни преобразувания. Освен това всеки потребител може да промени параметрите на сесията си по всяко време, така че задаването на тази настройка по подразбиране при влизане разчита никога да не я променя по време на сесията си.

[TL;DR] Коригирайте скрипта си така, че да не използва неявни преобразувания между типове данни, вместо да модифицира модела на формат, използван за неявни преобразувания.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Грешка ORA-00932 при използване на избор с полета за съюз и CLOB

  2. как да използвам regexp_like на Oracle в Hibernate HQL?

  3. Коя е Диана и защо тя не позволява да се компилират обектите ми от база данни?

  4. Oracle – Какъв файл с имена на TNS използвам?

  5. Oracle - Материализираният изглед променя структурата толкова бавно