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

Tham số ngày PL / SQL động với giá trị thời gian được giữ lại

Sử dụng các biến liên kết

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.

Vấn đề với mã của bạn là để tạo chuỗi của bạn, Oracle phải chuyển đổi DATE thành VARCHAR2 . Nó thực hiện điều đó bằng cách sử dụng NLS_DATE_FORMAT trong phiên của bạn . Nhưng NLS_DATE_FORMAT của phiên của bạn có thể không bao gồm thành phần thời gian vì vậy thời gian bị mất khi thủ tục của bạn thực sự được gọi. Sử dụng các biến liên kết có nghĩa là bạn không phải đối phó với loại chuyển đổi ngầm đó (nó cũng hiệu quả hơn và an toàn hơn).

Nếu bạn thực sự muốn tránh sử dụng các biến liên kết, bạn có thể truyền sysdate một cách rõ ràng thành một chuỗi bằng to_char và sau đó đặt to_date trong lệnh gọi thủ tục động. Nhưng đó là rất nhiều mã bổ sung và một số chuyển đổi không cần thiết.

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. php:loading trình điều khiển oracle báo lỗi Không thể tải thư viện động - Không thể tìm thấy quy trình đã chỉ định.

  2. Ngày trích xuất từ ​​chuỗi oracle

  3. Cách trích xuất số tháng từ ngày trong Oracle

  4. Cố gắng tìm các phương tiện rảnh giữa hai ngày thay đổi

  5. vấn đề ngủ đông oracle10g