Oracle错误:字符串缓冲区太小

时间:2012-07-02 14:48:33

标签: sql oracle coldfusion coldfusion-8

我正在运行一个基本查询,它根据基本的条件子句检索行,没有什么复杂的。这很好用:

<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”的视图,还是在这里有其他东西在玩我完全没有意识到?

2 个答案:

答案 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 字段作为过滤子句是一个红色鲱鱼错误。我不知道查询中哪个字段需要增加允许的长度,但它确实有效,所以我很高兴。