estoy tratando de escribir alguna función agregada para el VARRAY y consigo este código de error cuando estoy tratando de usarlo con datos de la base de datos:Oracle usuario define la función agregada de VARRAY de varchar
ORA-00600 internal error code, arguments: [kodpunp1], [], [], [], [], [], [], [], [], [], [], []
[koxsihread1], [0], [3989], [45778], [], [], [], [], [], [], [], []
código de la función es muy simple (de hecho no hace nada):
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;
siguiente que crear algunos datos de prueba:
create table t1_test_table(
t1_id number not null,
t1_value TEST_VECTOR not null,
Constraint PRIMARY_KEY_1 PRIMARY KEY (t1_id)
)
El siguiente paso es poner algunos datos a la tabla
insert into t1_test_table (t1_id,t1_value) values (1,TEST_VECTOR('x','y','z'))
Ahora todo está preparado para realizar consultas:
Select test_fn(TEST_VECTOR('y','x')) from dual
consulta anterior así el trabajo
Select test_fn(t1_value) from t1_test_table where t1_id = 1
versión de Oracle DBMS utilizo : 11.2.0.3.0
¿Alguien ha intentado hacer tal cosa? ¿Por qué crees que no está funcionando?
ORA-600 -> vaya al soporte de Oracle y busque correcciones de errores. Si no encuentra ninguno, presente una solicitud de soporte. – Mat
No hay necesidad de reinventar la rueda. En 11.2 tiene [listagg] (http://docs.oracle.com/cd/E14072_01/server.112/e10592/functions087.htm) y si realmente desea que un usuario haya definido una copia y pegue [Tom Kyte's stragg] (http://asktom.oracle.com/pls/asktom/f?p=100:11:0::NO::P11_QUESTION_ID:2196162600402). – Ben
@Ben De hecho, no quiero obtener todos los resultados del grupo. Estoy interesado en un solo resultado específico (de hecho el más reciente, ordenado por una columna). Se puede hacer gracias a la función 'Primero', por ejemplo: Seleccionar column_name_2 aggregate_function (column_name) KEEP (DENSE_RANK LAST ORDER BY x) DESDE el grupo W por column_name_2. También se puede hacer de otra manera, pero creo que es bastante bueno. – baju