2012-07-02 68 views
0

我正在運行基於基本條件子句檢索行的基本查詢,沒有什麼複雜的。這工作正常:Oracle錯誤:字符串緩衝區太小

<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:在 「BANINST1.TJUCATALOG_PACK」,線路519

這可能是一個需要包含字段「術語」的視圖,或者在這裏我還沒有其他的東西我完全不知道?

+0

tjucatalog是一個視圖嗎? –

+1

從名稱看,'BANINST1.TJUCATALOG_PACK'看起來像一個包,你可以在'all_objects'中檢查;並且可能有一個'varchar2'列在某處聲明太小 - 可能是對「term」的引用,但不一定。但目前還不清楚它適合於圖片的位置。tjucatalog是一種視圖嗎?你確定這個錯誤是來自這個select,而不是你以後使用其中一個返回值的地方嗎? –

+0

使用ALL_SOURCE查看軟件包的代碼。 –

回答

2

我們的Oracle專家返回並告訴我們,他們必須將字段類型從varchar2(4000)更改爲CLOB。缺少術語字段作爲篩選子句是一個紅鯡魚錯誤。我不知道查詢中哪個字段需要增加允許的長度,但它起作用,所以我很高興。

+1

甜美,簡短,完美地解決了這個問題。謝謝! –

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_barvarchar2(10) ,這對id=2foo值太小。我應該宣佈它爲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; 
+0

如果'TJUCATALOG_PACK'是一個包(它給出名稱的可能性),那麼過濾'和type ='PACKAGE BODY''就是個好主意。雖然錯誤的行數是519,但規範和正文之間的來源可能很少有混淆。 – APC

+0

@APC - 謝謝,好點。沒有這個過濾器的情況下單獨進行排序會讓它有點難以遵循。 –

+1

@APC,我不相信你從未見過519行包規範:-)。 – Ben

相關問題