Próbuję napisać łączną funkcję dla VArray i uzyskać ten kod błędu, kiedy staram się używać go z danymi z DB:Oracle User zdefiniowano funkcję zbiorczą dla VArray z varchar
ORA-00600 internal error code, arguments: [kodpunp1], [], [], [], [], [], [], [], [], [], [], []
[koxsihread1], [0], [3989], [45778], [], [], [], [], [], [], [], []
Kod funkcji jest bardzo proste (w rzeczywistości nic nie robi):
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;
Następny tworzę jakieś dane testowe:
create table t1_test_table(
t1_id number not null,
t1_value TEST_VECTOR not null,
Constraint PRIMARY_KEY_1 PRIMARY KEY (t1_id)
)
Następny krokiem jest wprowadzenie pewnych danych do tabeli
insert into t1_test_table (t1_id,t1_value) values (1,TEST_VECTOR('x','y','z'))
Teraz wszystko jest przygotowane do wykonywania zapytania:
Select test_fn(TEST_VECTOR('y','x')) from dual
Zapytanie powyższe dobrze
Select test_fn(t1_value) from t1_test_table where t1_id = 1
wersja Oracle DBMS używam : 11.2.0.3.0
Czy ktoś próbował zrobić coś takiego? Dlaczego uważasz, że to nie działa?
ORA-600 -> przejdź do wsparcia Oracle i szukaj poprawek. Jeśli go nie znajdziesz, prześlij prośbę o wsparcie. – Mat
Nie trzeba ponownie wynajdować koła. W 11.2 masz [listagg] (http://docs.oracle.com/cd/E14072_01/server.112/e10592/functions087.htm) i jeśli naprawdę chcesz, aby użytkownik zdefiniował jedną kopię i wklejeł [Tom Kyte's stragg] (http://asktom.oracle.com/pls/asktom/f?p=100:11:0::NO::P11_QUESTION_ID:2196162600402). – Ben
@Ben W rzeczywistości nie chcę, aby wszystkie wyniki z grupy. Interesuje mnie tylko jeden konkretny wynik (w rzeczywistości najnowszy, posortowany według jednej kolumny). Można to zrobić za pomocą funkcji "First" na przykład: Wybierz column_name_2 aggregate_function (column_name) KEEP (DENSE_RANK LAST ORDER BY x) Z grupy W wg kolumny nazwa_2. Można to zrobić także w inny sposób, ale myślę, że jest całkiem niezły. – baju