Използвайте свързващи променливи
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.
Проблемът с вашия код е, че за да изгради вашия низ, Oracle трябва да конвертира DATE
към VARCHAR2
. Той прави това, като използва NLS_DATE_FORMAT
на вашата сесия . Но вашата сесия NLS_DATE_FORMAT
вероятно не включва времевия компонент, така че времето се губи, когато вашата процедура действително се извика. Използването на обвързващи променливи означава, че не е нужно да се справяте с този вид имплицитно преобразуване (също така е по-ефективно и по-сигурно).
Ако наистина искате да избегнете използването на свързващи променливи, можете изрично да прехвърлите sysdate
към низ с помощта на to_char
и след това поставете to_date
в извикването на динамична процедура. Но това е много допълнителен код и редица ненужни преобразувания.
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.