我如何在oracle中运行过程,其中包含一些日期操作sql



我在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)中运行这个过程

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);

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

相关内容

最新更新