gpt4 book ai didi

oracle - 保留时间值的动态 PL/SQL 日期参数

转载 作者:行者123 更新时间:2023-12-04 17:36:01 25 4
gpt4 key购买 nike

这可能是一个愚蠢的问题,但我找不到在动态调用的 PL/SQL proc 中传递“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;
/

这里的输出是 - 日期是:2013 年 8 月 27 日 00:00:00。

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

最佳答案

使用绑定(bind)变量

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

如果你真的想避免使用绑定(bind)变量,你可以显式转换 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.

关于oracle - 保留时间值的动态 PL/SQL 日期参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18455867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com