PLS-00221 'to_date' 不是程序或未定义的错误,并转换以句点分隔的日期

Posted

技术标签:

【中文标题】PLS-00221 \'to_date\' 不是程序或未定义的错误,并转换以句点分隔的日期【英文标题】:PLS-00221 'to_date' is not a procedure or undefined error and converting dates separated by periodPLS-00221 'to_date' 不是程序或未定义的错误,并转换以句点分隔的日期 【发布时间】:2018-08-16 06:24:47 【问题描述】:

我想将类型为 varchar2 的 IN 参数转换为日期,以便我可以在两个输入日期之间从数据库中提取数据。我有一个问题和一个问题。

问题是我收到错误

“PLS-00221:to_date 不是过程或未定义”

当我有以下代码时:

create or replace procedure display_users(          pi_date1       in varchar2,
                                                    pi_date2       in varchar2,
                                                    po_userc       out sys_refcursor) is

begin

  if pi_date1 is not null then
    to_date(pi_date1, 'DD/MM/YYYY HH24:MI:SS');
  end if;

  begin
    open po_userc for
      select ... 
        from ...
       where ...
         and ...
         and t.inserted_date betweeen pi_date1 and pi_date2 ;
  end;

end;

我对pl/sql过程不是很熟悉,我尝试了很多其他的方法来让它工作,但我无法做到。

问题是在数据库中我的日期是这样的:'16.08.2018 10:30:48'(我无法更改数据库中的数据格式)

日期部分用句点 (.) 分隔。 to_date(pi_date1, 'DD/MM/YYYY HH24:MI:SS'); 会因为日期被“/”分隔而工作吗?

【问题讨论】:

试试这个 pi_date1 := to_date(pi_date1, 'DD/MM/YYYY HH24:MI:SS'); @Ovoxo 您无法将日期分配给 varchar2 @hotfix 那是我的错! 您的光标看起来还不太正确。 inserted_date 是什么类型?为什么date1date2varchar2 类型?如果您将date1 转换为date,您还应该将date2 转换为date inserted_date 是日期类型,我被要求将 date1 和 date2 创建为 varchar2。我要转换他们两个我只是没有在这里发布。谢谢你们俩的帮助 【参考方案1】:

正如错误消息所说,to_date 不是一个过程。 to_date 是一个函数,函数总是返回一个值。您必须将此值分配给变量。

declare
  v_date  date;
begin
  v_date := to_date(pi_date1, 'DD/MM/YYYY HH24:MI:SS');
end;
/

转换为日期时,您必须注意格式。日、月、年、时、分、秒之间有分隔符吗?如果是点 (.),则必须将其指定为格式。

如果您的字符串如下所示:01.01.2000 01:01:01 那么你的格式必须是这样的:'DD.MM.YYYY HH24:MI:SS'

如果您的字符串如下所示:01/01/2000 01:01:01 那么你的格式必须是这样的:'DD/MM/YYYY HH24:MI:SS'

【讨论】:

以上是关于PLS-00221 'to_date' 不是程序或未定义的错误,并转换以句点分隔的日期的主要内容,如果未能解决你的问题,请参考以下文章

解决PLS-00221: 'FUN2' 不是过程或尚未定义 的总结

Dapper 无法运行程序并返回异常 PLS-00221

使用 StoredProcedureQuery 调用 Oracle 函数?

使用 Dapper 执行 Oracle 包的功能

Impala 是不是有类似 to_date (oracle) 的功能?

查询两个日期(时间)以内的数据,between and 或 and 连>= <=,to_date()