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

Parameter tanggal PL/SQL dinamis dengan nilai waktu dipertahankan

Gunakan variabel ikat

SQL> create or replace procedure proc( p_dt in date )
  2  as
  3  begin
  4    dbms_output.put_line( to_char( p_dt, 'yyyy-mm-dd hh24:mi:ss' ));
  5  end;
  6  /

Procedure created.

SQL> declare
  2    l_sql varchar2(1000);
  3  begin
  4    l_sql := 'begin proc(:dt); end;';
  5    execute immediate l_sql using sysdate;
  6  end;
  7  /
2013-08-26 22:14:26

PL/SQL procedure successfully completed.

Masalah dengan kode Anda adalah bahwa untuk membangun string Anda, Oracle harus mengonversi DATE ke VARCHAR2 . Itu dilakukan dengan menggunakan NLS_DATE_FORMAT sesi Anda . Tapi NLS_DATE_FORMAT sesi Anda mungkin tidak menyertakan komponen waktu sehingga waktu hilang ketika prosedur Anda benar-benar dipanggil. Menggunakan variabel bind berarti Anda tidak perlu berurusan dengan konversi implisit semacam itu (ini juga lebih efisien dan lebih aman).

Jika Anda benar-benar ingin menghindari penggunaan variabel bind, Anda dapat secara eksplisit menggunakan sysdate ke string menggunakan to_char lalu beri to_date dalam panggilan prosedur dinamis. Tapi itu banyak kode tambahan dan sejumlah konversi yang tidak perlu.

SQL> ed
Wrote file afiedt.buf

  1  declare
  2    l_sql varchar2(1000);
  3  begin
  4    l_sql := q'{begin proc(to_date('}' ||
  5               to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') ||
  6               q'{', 'yyyy-mm-dd hh24:mi:ss')); end;}';
  7    execute immediate l_sql;
  8* end;
SQL> /
2013-08-26 22:19:52

PL/SQL procedure successfully completed.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. kueri untuk menemukan semua kolom dalam tabel tanpa nilai di dalamnya

  2. Pengelompokan data ke dalam tabel yang berbeda berdasarkan tanggal minimum suatu peristiwa

  3. Kelas OracleBulkCopy di Oracle.ManagedDataAccess.dll?

  4. Apakah COUNT(rowid) Lebih Cepat Dari COUNT(*)?

  5. Gunakan database Oracle dengan otentikasi formulir dalam aplikasi MVC3