2012-09-02 12 views
9

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?

+4

ORA-600 -> przejdź do wsparcia Oracle i szukaj poprawek. Jeśli go nie znajdziesz, prześlij prośbę o wsparcie. – Mat

+3

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

+0

@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

Odpowiedz

-4

"Wewnętrzny kod błędu ORA-00600, argumenty:", Wskazuje, że niektóre bloki są wewnętrznie uszkodzone, spróbuj odzyskać systemowy obszar tabel i konkretny obszar tabel użytkownika.

+5

-1 Ta odpowiedź nie pomoże rozwiązać tego problemu i ogólnie jest złą radą. Problem można odtworzyć za pomocą dostarczonych danych przykładowych, nie ma uszkodzonych bloków. ORA-00600 oznacza po prostu błąd Oracle, niekoniecznie oznacza to, że dane są nieprawidłowe. –

+1

ORA-00600 to ogólny kod Oracle dla nieobsłużonych wewnętrznych wyjątków, tj. Błędów. Uszkodzone bloki są jednym z możliwych źródeł błędów ORA-00600, ale istnieje wiele innych. Argumenty wskazują konkretną przyczynę. Zalecane działanie polega na połączeniu się z działem wsparcia Oracle, ponieważ rozwiązanie może wymagać poprawki. – APC

0

Jak zanotowano, ORA-00600 jest wewnętrznym błędem Oracle. Nie ma dla nich rymu ani powodu, a jedyną prawdziwą poprawką jest uzyskanie łatki od Oracle.

Jednak ... to wszystko powiedziane ... często można nieco poprawić kod, aby uniknąć błędu.

W twoim przypadku, można to zrobić:

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

Oznacza to, że jawnie rzutować kolumnę jako test_vector przed przekazaniem go do agregatu ODCI.

To działa w 12c, w każdym razie. (I, w 12c, otrzymasz ORA-00600 bez tej poprawki).

Powiązane problemy