2012-09-02 113 views
9

我試圖寫的VARRAY一些聚合函數的變長數組,我得到當我試圖從DB數據使用此錯誤代碼:Oracle用戶定義聚合函數VARCHAR

ORA-00600 internal error code, arguments: [kodpunp1], [], [], [], [], [], [], [], [], [], [], [] 
[koxsihread1], [0], [3989], [45778], [], [], [], [], [], [], [], [] 

該函數的代碼是非常簡單的(其實它什麼都不做):

create or replace 
TYPE "TEST_VECTOR" as varray(10) of varchar(20) 
ALTER TYPE "TEST_VECTOR" MODIFY LIMIT 4000 CASCADE 


create or replace 
type Test as object(
    lastVector TEST_VECTOR, 

    STATIC FUNCTION ODCIAggregateInitialize(sctx in out Test) return number, 
MEMBER FUNCTION ODCIAggregateIterate(self in out Test, value in TEST_VECTOR) return number, 
MEMBER FUNCTION ODCIAggregateMerge(self IN OUT Test, ctx2 IN Test) return number, 
MEMBER FUNCTION ODCIAggregateTerminate(self IN Test, returnValue OUT TEST_VECTOR, flags IN number) return number 
); 

create or replace 
type body Test is 
    STATIC FUNCTION ODCIAggregateInitialize(sctx in out Test) return number is 
    begin 
    sctx := Test(TEST_VECTOR()); 
    return ODCIConst.Success; 
    end; 
MEMBER FUNCTION ODCIAggregateIterate(self in out Test, value in TEST_VECTOR) return number is 
begin 
    self.lastVector := value; 
    return ODCIConst.Success; 
end; 
MEMBER FUNCTION ODCIAggregateMerge(self IN OUT Test, ctx2 IN Test) return number is 
begin 
return ODCIConst.Success; 
end; 
MEMBER FUNCTION ODCIAggregateTerminate(self IN Test, returnValue OUT TEST_VECTOR, flags IN number) return number is 
begin 
    returnValue := self.lastVector; 
return ODCIConst.Success; 
end; 
end; 

create or replace 
FUNCTION test_fn (input TEST_VECTOR) RETURN TEST_VECTOR 
PARALLEL_ENABLE AGGREGATE USING Test; 

接下來,我創建一些測試數據:

create table t1_test_table(
    t1_id number not null, 
    t1_value TEST_VECTOR not null, 
    Constraint PRIMARY_KEY_1 PRIMARY KEY (t1_id) 
) 

下一步是把一些數據表

insert into t1_test_table (t1_id,t1_value) values (1,TEST_VECTOR('x','y','z')) 

現在一切都準備好執行查詢:

Select test_fn(TEST_VECTOR('y','x')) from dual 

查詢上述工作以及

Select test_fn(t1_value) from t1_test_table where t1_id = 1 

版本的Oracle DBMS的我用:11.2.0.3.0

有沒有人試過做過這樣的事情? 你爲什麼認爲它不起作用?

+4

ORA-600 - >去Oracle支持和尋找錯誤修復。如果您找不到,請提出支持請求。 – Mat

+3

沒有必要重新發明車輪。在11.2中你有[listagg](http://docs.oracle.com/cd/E14072_01/server.112/e10592/functions087.htm),如果你真的想要一個用戶定義一個副本並粘貼[Tom Kyte's stragg]( http://asktom.oracle.com/pls/asktom/f?p=100:11:0::NO::P11_QUESTION_ID:2196162600402)。 – Ben

+0

@Ben事實上,我不想從組中獲得所有結果。我只對一個特定的結果感興趣(實際上是最新的一個,按一列排序)。可以通過例如'First'功能來完成: Select column_name_2 aggregate_function(column_name)KEEP(DENSE_RANK LAST ORDER BY x )從column_name_2的W group中獲得。它也可以用其他方式完成,但是我認爲這很好。 – baju

回答

-4

「ORA-00600內部錯誤代碼,參數:」,它表示某些塊在內部損壞嘗試恢復系統表空間和特定用戶表空間。

+5

-1這個答案不會幫助解決這個問題,一般來說是不好的建議。問題可以通過提供的樣本數據進行復制,沒有損壞的塊。 ORA-00600只是意味着一個Oracle錯誤,並不一定意味着數據有任何問題。 –

+1

ORA-00600是Oracle針對未處理的內部異常(即錯誤)的通用代碼。損壞的塊是ORA-00600錯誤的一個可能來源,但還有許多其他錯誤。這些論據表明了具體原因。建議的操作是致電Oracle Support,因爲解決方案可能需要補丁。 – APC

0

如前所述,ORA-00600是一個內部的Oracle錯誤。他們沒有任何押韻或理由,唯一真正的解決辦法是從Oracle獲得補丁。

但是...所有的說......通常可以稍微調整一下你的代碼以避免bug。

在你的情況,你可以這樣做:

Select test_fn(cast(t1_value as test_vector)) 
from t1_test_table 
where t1_id = 1; 

也就是說,它傳遞到您的ODCI彙總之前明確轉換列作爲test_vector

無論如何,這工作在12C。 (並且,在12c中,如果沒有此修復,您將獲得ORA-00600)。