我正在运行一个基本查询,它根据基本的条件子句检索行,没有什么复杂的。这很好用:
<cfquery name="courses" datasource="banner">
SELECT *
FROM tjucatalog
WHERE (course_status = 'Active')
AND CONCAT(subject,course_no) IN (#PreserveSingleQuotes(courselist)#)
AND term IN ('Fall 2012')
AND ((end_date > #now()#) OR (course_meeting_info IS NOT NULL))
ORDER BY TYear, TSort, DayNum, start_date, time, title
</cfquery>
但是,当我从查询中删除“AND term IN”行时,它会失败。
<cfquery name="courses" datasource="banner">
SELECT *
FROM tjucatalog
WHERE (course_status = 'Active')
AND CONCAT(subject,course_no) IN (#PreserveSingleQuotes(courselist)#)
AND ((end_date > #now()#) OR (course_meeting_info IS NOT NULL))
ORDER BY TYear, TSort, DayNum, start_date, time, title
</cfquery>
我得到的错误是: ORA-06502:PL / SQL:数字或值错误:字符串缓冲区太小ORA-06512:at“BANINST1.TJUCATALOG_PACK”,第519行
这可能是一个需要包含字段“term”的视图,还是在这里有其他东西在玩我完全没有意识到?
答案 0 :(得分:3)
这可能是从视图中调用的一个包中的错误。您正在查询tjucatalog
,这似乎是合理的,其中一个返回列实际上是一个函数调用。
问题不一定是term
列。通过删除该条件,将返回更多行,并且当条件到位时,将针对来自行不存在的行的列值调用该函数。但它可能是其中一个现在可见行中的任何列。
作为可能发生的事情的一个简单而做作的例子:
create table t42 (id number, foo varchar2(20));
insert into t42 (id, foo) values (1, 'Short');
insert into t42 (id, foo) values (2, 'More than 10');
create package p42 as
function func(p_id in number) return varchar2;
end p42;
/
create package body p42 as
function func(p_id in number) return varchar2 is
l_bar varchar2(10);
begin
select foo into l_bar from t42 where id = p_id;
return l_bar;
end func;
end p42;
/
create view v42 as select id, p42.func(id) as bar from t42;
所以我们有一个包含两行的表,一行的foo
少于10个字符,另一行超过10个字符。我们有一个(愚蠢的)包函数,它接受id
值,查找foo
并返回它。以及使用该功能的视图。
这有效:
select * from v42 where id = 1;
ID BAR
---------- --------------------
1 Short
但删除该条件会导致其失败:
select * from v42;
ERROR:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "SCOTT.P42", line 5
我的包裹体的第5行是select foo into l_bar from t42 where id = p_id;
,问题是我已将l_bar
声明为varchar2(10)
,这对于foo
id=2
来说太小了{1}}。我应该将其声明为varchar2(20)
,或者更好t42.foo%TYPE
。
要查看您的有问题的功能正在做什么,请查看源代码,如果您没有它可以从数据库中获取(如果它没有被包装):
select line, text from all_source
where owner = 'BANINST1'
and name = 'TJUCATALOG_PACK'
and type = 'PACKAGE BODY'
order by line;
答案 1 :(得分:2)
我们的Oracle大师回来告诉我们他们必须将字段类型从varchar2(4000)更改为CLOB。缺少 term 字段作为过滤子句是一个红色鲱鱼错误。我不知道查询中哪个字段需要增加允许的长度,但它确实有效,所以我很高兴。