バインド変数を使用する
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.