【问题标题】:Dynamic PL/SQL date parameter with time value retained保留时间值的动态 PL/SQL 日期参数
【发布时间】:2013-08-29 15:15:30
【问题描述】:

这可能是一个愚蠢的问题,但我找不到在动态调用的 PL/SQL 过程中传递“DATE”类型的解决方案。我需要的是在被调用的过程中传递日期和时间部分:

create or replace 
PROCEDURE DATE_TIME_TEST (  dte_Date_IN  IN DATE ) 
IS
    vch_SQL_Stmnt VARCHAR2(2000);
BEGIN
    DBMS_OUTPUT.PUT_LINE('Date is :'||TO_CHAR(dte_Date_IN, 'DD-Mon-YYYY HH24:MI:SS'));

END;
/

declare
    v_sql varchar2(2000);
begin
    v_sql := 'begin DATE_TIME_TEST( dte_Date_IN => '''|| 
              sysdate || ''''|| '); end;';
    execute immediate v_sql;
end; 
/

这里的输出是 - 日期是 :27-Aug-2013 00:00:00。

我希望它是 - 日期是:2013 年 8 月 27 日 13:01:09

【问题讨论】:

  • dte_Date_IN 可能没有时间信息。尝试 dbms_output(dte_Date_IN)。
  • 确实有时间,如您所见,我在示例中传递了 SYSDATE

标签: oracle dynamic plsql proc


【解决方案1】:

使用绑定变量

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 可能不包括时间组件,因此在实际调用您的过程时时间会丢失。使用绑定变量意味着您不必处理那种隐式转换(它也更高效、更安全)。

如果您真的想避免使用绑定变量,您可以使用to_charsysdate 显式转换为字符串,然后在动态过程调用中放入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.

【讨论】:

  • 太棒了。非常感谢贾斯汀。这正是我一直在寻找的。唯一的事情是我想在 DBMS_SCHEDULER.create_job 中使用它,你知道我可以在那里使用绑定变量吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-12
  • 2019-01-23
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多