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?
ORA-600 -> gehen Sie zur Oracle-Unterstützung und suchen Sie nach Bugfixes. Wenn Sie keine finden, reichen Sie eine Supportanfrage ein. – Mat
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
@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