2012-09-02 17 views
9

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?

+4

ORA-600 -> vaya al soporte de Oracle y busque correcciones de errores. Si no encuentra ninguno, presente una solicitud de soporte. – Mat

+3

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

+0

@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

Respuesta

-4

"ORA-00600 código de error interno, argumentos:", indica que algunos bloques están dañados internamente, intente recuperar el espacio de tabla del sistema y el espacio de tabla de usuario particular.

+5

-1 Esta respuesta no ayudará a resolver este problema y es un mal consejo en general. El problema se puede reproducir con los datos de muestra proporcionados, no hay bloques dañados. ORA-00600 solo significa un error de Oracle, no necesariamente significa que algo anda mal con los datos. –

+1

ORA-00600 es el código genérico de Oracle para excepciones internas no manejadas, es decir, errores. Los bloques dañados son una posible fuente de errores ORA-00600, pero hay muchos otros. Los argumentos indican la causa específica. La acción recomendada es llamar al Soporte Oracle, ya que la solución puede requerir un parche. – APC

0

Como se ha observado, ORA-00600 es un error interno de Oracle. No tienen rima o razón y la única solución verdadera es obtener un parche de Oracle.

Sin embargo ... todo lo dicho ... a menudo es posible modificar un poco tu código para evitar el error.

En su caso, usted puede hacer esto:

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

Es decir, convertir explícitamente la columna como test_vector antes de pasarlo a su agregado ODCI.

Esto funciona en 12c, de todos modos. (Y, en 12c, obtendrá el ORA-00600 sin esta solución, también).

Cuestiones relacionadas