0

我在 oracle 中创建了一个过程,如下所示:

create or replace PROCEDURE SP_X_AVERAGE
(
    profile out SYS_REFCURSOR,
    rx out SYS_REFCURSOR,
)
as
BEGIN


  open profile for
        select
            avg(to_number(profile_netassets)) AS netassets
        from 
            fgp;


  open rx for
      select 
          avg(to_number(a_price)) as twr 
      from 
          r_x
      where 
            gq_date <= add_months(to_date(sysdate, 'mm/dd/yyyy'), -12);


END SP_X_AVERAGE;

它没有运行,出现以下错误:

ORA-01843: not a valid month

如果我删除第二个 sql 中的 where 条件,那么它会成功运行。

在同一过程中使用 sql 更改会话也不起作用。

请帮忙。

我在 sql-developer (ubuntu Oneiric 11) 中运行这个程序

4

1 回答 1

3

SYSDATE 已经是一个 DATE,因此您不需要对其应用 TO_DATE()。但是,较新的 Oracle 版本可以容忍此类事情并优雅地处理它们。

所以剩下的问题是r_x.gq_date:那是什么数据类型?如果它是一个字符串,那么您可能有其中的值不会转换为日期,或者最终与您的默认 NLS_FORMAT 不匹配。


“我们必须将其保留为“VARCHAR2(40 BYTE)”,其中包含这样的日期:'1/2/2003'”

答对了。这和你的 NLS_DATE_FORMAT 一样吗?如果不是,您将需要转换列:

to_date(gq_date, 'mm/dd/yyyy')  <= add_months(sysdate, -12);

如果列包含不是该格式的字符串,这可能无法解决您的问题。这是使用字符串来保存不是字符串的东西的常见副作用。

于 2013-03-06T13:40:02.203 回答