sql >> Base de Datos >  >> RDS >> Oracle

ORA-06508:PL/SQL:no se pudo encontrar la unidad de programa a la que se llamó

Sospecho que solo estás informando el último error en una pila como esta:

ORA-04068: existing state of packages has been discarded
ORA-04061: existing state of package body "schema.package" has been invalidated
ORA-04065: not executed, altered or dropped package body "schema.package"
ORA-06508: PL/SQL: could not find program unit being called: "schema.package"

Si es así, es porque su paquete tiene estado:

Los valores de las variables, constantes y cursores que declara un paquete (ya sea en su especificación o cuerpo) constituyen su paqueteestado . Si un paquete PL/SQL declara al menos una variable, constante o cursor, entonces el paquete tiene estado.; de lo contrario, es sin estado .

Cuando recompilas el estado se pierde:

Si el cuerpo de un paquete instanciado con estado se vuelve a compilar (ya sea explícitamente, con la "Declaración ALTER PACKAGE" o implícitamente), la siguiente invocación de un subprograma en el paquete hace que Oracle Database descarte el estado del paquete existente y genere la excepción ORA-04068.

Después de que PL/SQL genera la excepción, una referencia al paquete hace que Oracle Database vuelva a crear una instancia del paquete, lo que lo reinicializa...

No puede evitar esto si su paquete tiene estado. Sin embargo, creo que es bastante raro que realmente necesite que un paquete tenga estado, por lo que debe revisar todo lo que haya declarado en el paquete, pero fuera de una función o procedimiento, para ver si realmente se necesita en ese nivel. Sin embargo, como estás en 10g, eso incluye constantes, no solo variables y cursores.

Pero el último párrafo de la documentación citada significa que la próxima vez que haga referencia al paquete en la misma sesión, no obtendrá el error y funcionará con normalidad (hasta que vuelva a compilar).