Oracle 保留时间值的动态PL/SQL日期参数
这可能是一个愚蠢的问题,但我找不到在动态调用的PL/SQL过程中传递“DATE”类型的解决方案。我需要的是在被调用的进程中传递日期和时间部分:Oracle 保留时间值的动态PL/SQL日期参数,oracle,dynamic,plsql,proc,Oracle,Dynamic,Plsql,Proc,这可能是一个愚蠢的问题,但我找不到在动态调用的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-M
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;
/
此处的输出为-日期为:2013年8月27日00:00:00
我希望它是-日期是:27-Aug-2013 13:01:09使用绑定变量
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\u DATE\u格式来实现这一点。但是会话的NLS\u DATE\u格式可能不包含时间组件,因此在实际调用过程时会损失时间。使用绑定变量意味着您不必处理这种隐式转换(它也更高效、更安全)
如果确实希望避免使用绑定变量,可以使用to\u char
将sysdate
显式转换为字符串,然后在动态过程调用中放入to\u 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.
中的dte_Date_可能没有时间信息。尝试dbms_输出(dte_Date_IN)。它确实有时间,因为您可以看到我在示例中传递了SYSDATE。非常感谢贾斯汀。这正是我要找的。唯一的问题是我想在DBMS_SCHEDULER.create_作业中使用它,你知道我如何在那里使用绑定变量吗?