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.