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.