PLS-00653: aggregate/table functions are not allowed in PL/SQL scope

El error PLS-00653 está reportado por el soporte de Oracle en la nota Doc ID 1371524.1 y afecta a las bases de datos 10.2.0.1 (10R2) y posteriores.

Según esta nota, el error está identificado y verificado en el Bug no publicado 5668788. Y como solución proponen no sobrecargar funciones PIPELINED.

Lo primero que tenemos que hacer, por lo tanto, es identificar las funciones que están generando este error de compilación. Y para lograrlo disponemos de una vista del diccionario de datos que nos ofrece toda la información necesaria: DBA_PROCEDURES (y sus alternativas ALL_PROCEDURES y USER_PROCEDURES)

La primera consulta sobre la vista DBA_PROCEDURES muestra todas las funciones PIPELINED que existen en nuestra base de datos y que se encuentran sobrecargadas. Las funciones que generan el problema se encontrarán por tanto en el resultado de esta consulta:

-- PIPELINED functions overloaded
select *
from DBA_PROCEDURES
where pipelined = 'YES'
    and nvl(overload, -1) > 0;

Afinando un poco más, podemos identificar exactamente qué funciones están sobrecargadas por otra función no PIPELINED y proceder a renombrarlas:

-- PIPELINED overloaded with other not PIPELINED functions
select *
from DBA_PROCEDURES pipe
where pipelined = 'YES'
    and nvl(overload, -1) > 0
    and exists
    (
    select object_id
    from DBA_PROCEDURES no_pipe
    where no_pipe.pipelined = 'NO'
        and no_pipe.owner = pipe.owner
        and no_pipe.object_name = pipe.object_name
        and no_pipe.procedure_name = pipe.procedure_name
    );

Ya solo nos queda decidir a qué funciones vamos a cambiar el nombre, y de este modo evitar la sobrecarga. La decisión dependerá del impacto que suponga en cada caso el renombrado y la cantidad de código que deberemos adaptar.

Anuncios

Un pensamiento en “PLS-00653: aggregate/table functions are not allowed in PL/SQL scope

  1. Santiago Solá

    Buenas, yo creé dos funciones que devuelven un Type table las dos con nombres de tipo y de tabla diferentes y reciben diferentes parámetros, el. Problema es que cuando quiero ejecutarlas me dice que están sobrecargadas las funciones, yo ejecute la consulta y me salen las dos funciones que están sobrecargadas, como hago para cambiar los procedurename y name?

    Me gusta

    Responder

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

w

Conectando a %s