2012-09-02 7 views
9

Ich versuche, einige Aggregatfunktion für die VARRAY zu schreiben und ich erhalte diesen Fehler, wenn ich versuche, es mit Daten zu verwenden, von der DB:Oracle User Aggregatfunktion für VARRAY von varchar definiert

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

Code der Funktion wirklich einfach ist (in der Tat es tut nichts):

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; 

Next ich einige Testdaten zu erstellen:

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

Nächster Schritt ist es, einige Daten in die Tabelle

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

Jetzt ist alles setzen vorbereitete Abfragen auszuführen:

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

Abfrage über Arbeit gut

Select test_fn(t1_value) from t1_test_table where t1_id = 1 

Version von Oracle DBMS Ich benutze : 11.2.0.3.0

Hat jemand versucht, so etwas zu tun? Warum glaubst du, dass es nicht funktioniert?

+4

ORA-600 -> gehen Sie zur Oracle-Unterstützung und suchen Sie nach Bugfixes. Wenn Sie keine finden, reichen Sie eine Supportanfrage ein. – Mat

+3

Es gibt keine Notwendigkeit, das Rad neu zu erfinden. In 11.2 haben Sie [listagg] (http://docs.oracle.com/cd/E14072_01/server.112/e10592/functions087.htm) und wenn Sie wirklich wollen, dass ein Benutzer eine Kopie erstellt und [Tom Kytes stragg] (http://asktom.oracle.com/pls/asktom/f?p=100:11:::NO::P11_QUESTION_ID:2196162600402). – Ben

+0

@Ben In der Tat möchte ich nicht alle Ergebnisse aus der Gruppe erhalten. Ich interessiere mich für nur ein bestimmtes Ergebnis (in der Tat das neueste, sortiert nach einer Spalte) .Es kann dank der 'First' -Funktion zum Beispiel getan werden: Wählen column_name_2 aggregate_function (column_name) KEEP (DENSE_RANK LETZTE ORDER BY x) FROM W Gruppe nach Spaltenname_2. Es kann auch anders gemacht werden, aber das finde ich ziemlich gut. – baju

Antwort

-4

"Interner Fehlercode ORA-00600, Argumente:", Er weist darauf hin, dass einige Blöcke intern beschädigt sind. Versuchen Sie, den Systemtabellenbereich und den bestimmten Benutzertabellenbereich wiederherzustellen.

+5

-1 Diese Antwort wird nicht helfen, dieses Problem zu lösen und ist im Allgemeinen schlechter Rat. Das Problem kann mit den bereitgestellten Beispieldaten reproduziert werden, es gibt keine beschädigten Blöcke. ORA-00600 bedeutet nur einen Oracle-Fehler, es bedeutet nicht unbedingt, dass irgendetwas mit den Daten nicht stimmt. –

+1

ORA-00600 ist der generische Code von Oracle für unbehandelte interne Ausnahmen, d. H. Fehler. Beschädigte Blöcke sind eine mögliche Quelle für ORA-00600-Fehler, aber es gibt viele andere. Die Argumente geben die spezifische Ursache an. Die empfohlene Maßnahme besteht darin, den Oracle-Support anzurufen, da für die Lösung möglicherweise ein Patch erforderlich ist. – APC

0

Wie bereits erwähnt, ist ORA-00600 ein interner Oracle Bug. Für sie gibt es keinen Grund und Grund, und die einzige wirkliche Lösung ist, einen Patch von Oracle zu bekommen.

Jedoch ... das alles gesagt ... es ist oft möglich, Ihren Code ein wenig zu optimieren, um den Fehler zu vermeiden.

In Ihrem Fall, können Sie dies tun:

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

Das heißt, werfen die Spalte explizit als test_vector, bevor es sich in Ihrem ODCI Aggregat vorbei.

Dies funktioniert in 12c sowieso. (Und in 12c erhalten Sie den ORA-00600 auch ohne diesen Fix).