Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Skrip Liquibase mengembalikan ORA-01843:bukan bulan yang valid

'02.01.15 12:00:00' bukan tanggal itu adalah string; jika Anda mencoba memasukkannya ke dalam DATE kolom tipe data maka Oracle akan mencoba mentransmisikannya ke tanggal menggunakan yang setara dengan:

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

Jadi jika NLS_DATE_FORMAT Anda parameter session tidak cocok dengan format string Anda '02.01.15 12:00:00' maka itu akan menimbulkan pengecualian - dan inilah yang tampaknya terjadi karena Anda mendapatkan ORA-01843: not a valid month .

Solusi terbaik adalah memodifikasi skrip Anda untuk secara eksplisit mentransmisikan string ke tanggal:

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;

atau untuk menggunakan stempel waktu literal:TIMESTAMP '2015-01-02 12:00:00'

Tetapi Anda juga dapat membuat pemicu masuk untuk mengubah NLS_DATE_FORMAT parameter sesi. Bungkus pemicu di sekitar kode ini:

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

Namun, ini akan mengubah format tanggal yang digunakan di semua konversi implisit dari string ke tanggal (dan sebaliknya) sehingga dapat merusak kueri lain yang juga bergantung pada konversi implisit tersebut. Selain itu, setiap pengguna dapat mengubah parameter sesi mereka kapan saja sehingga pengaturan default ini saat masuk bergantung pada mereka yang tidak pernah mengubahnya selama sesi mereka.

[TL;DR] Perbaiki skrip Anda agar tidak menggunakan konversi implisit antar tipe data daripada memodifikasi model format yang digunakan untuk konversi implisit.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Klausa WHERE bersyarat dengan pernyataan CASE di Oracle

  2. Cara menulis kode di Oracle SQL (seperti 'CCYYMMDD' ke 102 )

  3. Menghitung jumlah baris yang bergabung di gabungan kiri

  4. Dapatkan jumlah semua tabel dalam skema

  5. Membangun daftar nilai yang dipisahkan koma dalam pernyataan Oracle SQL