我在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);
如果列包含非该格式的字符串,则可能无法解决问题。这是使用字符串来保存非字符串的东西的常见副作用。