Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Tập lệnh Liquibase trả về ORA-01843:không phải là tháng hợp lệ

'02.01.15 12:00:00' không phải là ngày mà nó là một chuỗi; nếu bạn đang cố gắng chèn nó vào một DATE cột kiểu dữ liệu thì Oracle sẽ cố gắng truyền nó thành một ngày bằng cách sử dụng tương đương với:

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

Vì vậy, nếu NLS_DATE_FORMAT của bạn tham số phiên không khớp với định dạng chuỗi của bạn '02.01.15 12:00:00' thì nó sẽ đưa ra một ngoại lệ - và đây là điều có vẻ sẽ xảy ra vì bạn đang nhận được ORA-01843: not a valid month .

Giải pháp tốt nhất là sửa đổi tập lệnh của bạn để truyền chuỗi một cách rõ ràng đến một ngày:

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;

hoặc sử dụng ký tự dấu thời gian:TIMESTAMP '2015-01-02 12:00:00'

Nhưng bạn cũng có thể tạo trình kích hoạt đăng nhập để thay đổi NLS_DATE_FORMAT tham số phiên. Quấn trình kích hoạt xung quanh mã này:

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

Tuy nhiên, điều này sẽ thay đổi định dạng ngày được sử dụng trong tất cả các chuyển đổi ngầm định từ chuỗi sang ngày (và ngược lại), do đó có thể phá vỡ các truy vấn khác cũng dựa trên các chuyển đổi ngầm đó. Ngoài ra, mỗi người dùng có thể thay đổi các tham số phiên của họ bất kỳ lúc nào, vì vậy việc đặt mặc định này khi đăng nhập dựa vào việc họ không bao giờ thay đổi nó trong phiên của họ.

[TL; DR] Sửa tập lệnh của bạn để không sử dụng các chuyển đổi ngầm định giữa các loại dữ liệu thay vì sửa đổi mô hình định dạng được sử dụng cho các chuyển đổi ngầm định.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tương đương với các hàm PostgreSQL array () / array_to_string () trong Oracle 9i

  2. làm thế nào để sử dụng regexp_like của Oracle trong Hibernate HQL?

  3. Cấu hình trình nghe Oracle để lắng nghe bên ngoài

  4. Làm cách nào để tôi có thể dễ dàng phân tích việc thực thi gói Oracle cho các vấn đề về hiệu suất?

  5. Oracle 11g - Làm thế nào để tối ưu hóa lựa chọn chèn song song chậm?