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

Bukan bulan yang valid saat menjalankan prosedur parameter IN dengan nilai tanggal

Prosedur Anda menggunakan parameter tipe timestamp . Anda sebenarnya melewatkan parameter tipe varchar2 dalam panggilan Anda. Itu memaksa Oracle untuk melakukan konversi implisit dari varchar2 parameter ke timestamp menggunakan NLS_TIMESTAMP_FORMAT sesi Anda . Itu kemungkinan akan berbeda untuk sesi yang berbeda sehingga kemungkinan setidaknya beberapa sesi akan mendapatkan kesalahan karena string tidak cocok dengan format NLS_TIMESTAMP_FORMAT sesi tersebut . Anda akan jauh lebih baik jika melewati stempel waktu aktual dengan memanggil to_timestamp secara eksplisit atau dengan melewatkan literal stempel waktu.

Prosedur Anda kemudian mengambil timestamp parameter dan meneruskannya ke to_date fungsi. to_date fungsi tidak mengambil parameter tipe timestamp , hanya membutuhkan parameter tipe varchar2 . Itu memaksa Oracle untuk melakukan konversi implisit lain dari timestamp parameter ke varchar2 , sekali lagi menggunakan NLS_TIMESTAMP_FORMAT sesi ini . Jika NLS_TIMESTAMP_FORMAT sesi tidak cocok dengan topeng format eksplisit di to_date your Anda panggilan, Anda akan mendapatkan kesalahan atau konversi akan mengembalikan hasil yang tidak Anda harapkan.

Jika kolom di tabel Anda sebenarnya bertipe date , Anda dapat langsung membandingkan date ke timestamp . Jadi sepertinya tidak ada alasan untuk memanggil to_date di sini. Berdasarkan data sampel Anda, tampaknya kolom di tabel Anda sebenarnya bertipe timestamp daripada date seperti yang tersirat dalam kode Anda, sejak date tidak memiliki presisi pecahan detik. Jika itu masalahnya, semakin tidak masuk akal untuk memanggil to_date di SELECT pernyataan karena parameter Anda sebenarnya bertipe timestamp dan kolom Anda bertipe timestamp . Bandingkan saja timestamp nilai.

Dugaan saya, oleh karena itu, Anda menginginkan sesuatu seperti

CREATE OR REPLACE PROCEDURE PROC1(
   V_STARTTIME    IN TIMESTAMP ,
   V_ENDTIME      IN TIMESTAMP )
BEGIN
  INSERT INTO TAB1( <<column name>> )
    SELECT COINS 
      FROM TAB2
     WHERE <<timestamp column name>> BETWEEN v_starttime AND v_endtime;
END;

dan Anda ingin menghitung prosedur dengan melewatkan stempel waktu aktual. Menggunakan literal stempel waktu

Execute proc1(timestamp '2014-05-05 11:25:00', timestamp '2014-05-05 12:25:00' )

atau dengan memanggil to_timestamp explicitly secara eksplisit

execute proc1( to_timestamp( '5/05/2014 11:25:00 AM', 'MM/DD/YYYY HH:MI:SS AM' ),
               to_timestamp( '5/05/2014 12:25:00 PM', 'MM/DD/YYYY HH:MI:SS AM' ) );

Itu akan menghilangkan semua konversi tipe implisit yang sedang berlangsung.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tanggal bulat hingga interval 10 menit

  2. cx_Oracle:Bagaimana saya bisa menerima setiap baris sebagai kamus?

  3. Cari string yang diberikan di semua bidang dari seluruh skema untuk Oracle

  4. hitung saldo berjalan dalam kueri oracle

  5. Spring Batch ORA-08177:tidak dapat membuat serial akses untuk transaksi ini saat menjalankan pekerjaan tunggal, tingkat isolasi SERIALIZED