2011-10-27 33 views
10

Así que he estado corriendo un procedimiento PLSQL muy bien, y compilar sin errores. Hice un cambio en mi procedimiento, y todavía compila bien, pero ahora cuando lo ejecuto, me sale este error:estado existente de paquetes se ha desechado

ERROR at line 1: 
ORA-04068: existing state of packages has been discarded 
ORA-04061: existing state of package body "SCHEMA.XP_COVER_PAGEP" has been invalidated 
ORA-04065: not executed, altered or dropped package body "SCHEMA.XP_COVER_PAGEP" 
ORA-06508: PL/SQL: could not find program unit being called: "SCHEMA.XP_COVER_PAGEP" 
ORA-06512: at "SCHEMA.XP_ST_002180", line 141 
ORA-06512: at line 1 

Alguna idea de lo que esto podría ser? El cambio que hice fue tan insignificante que dudo que pudiera haber causado este error. ¡Gracias de antemano por su ayuda!

Respuesta

23

Cuando una sesión hace uso de un paquete que retiene algo sesión de estado del paquete. Si ese paquete se recompila la próxima vez que la misma sesión haga referencia al paquete, obtendrá ese error.

Para evitar esto, asegúrese de desconectar cada sesión que pueden haber utilizado el paquete o tener la sesión hacen un DBMS_SESSION.RESET_PACKAGE para restablecer el estado de los paquetes.

+1

Gracias darreljnz, la solución funcionó bien para mí. Pero al principio no entendí lo que estabas haciendo. Por lo tanto, voy a aclarar su solución un poco para los demás. Abra una nueva ventana de prueba en pl/sql y pegue "Begin sys.dbms_session.reset_package; end;" y presiona F9 para ejecutarlo y luego hacer cambios en tu paquete o recompilar el paquete y ahora no obtendremos ningún error en nuestras aplicaciones –

+1

El mejor comienzo de una respuesta para este problema. Sería bueno ver esto llevado un poco más allá para explicar el problema central y por qué ocurre el error. –

+0

@YogeshJindal parece que dices algo diferente a darrelinjz. Escribió que debe ejecutar el RESET_PACKAGE, en cada sesión, después del cambio del paquete para evitar el error. – pauloya

4

Si vuelve a compilar una especificación del paquete todos los objetos dependientes se invalidan. Un objeto dependiente es cualquier vista, especificación de paquete, cuerpo de paquete, función o procedimiento que haga referencia a cualquiera de las declaraciones en la especificación de paquete recompilado.

Además, como lo señala darreljnz, las sesiones generalmente conservan referencias al estado de los paquetes a los que han accedido, causando un ORA-04068: existing state of packages has been discarded la próxima vez que la sesión intenta hacer referencia al paquete.

Este último comportamiento es una molestia real y hace que sea necesario escribir código para volver a intentar operaciones o cerrar todas las sesiones activas después de instalar una nueva versión de un paquete (reiniciando efectivamente la aplicación/servicio). En pocas palabras: hace que sea más difícil instalar revisiones.

3

Uso pragma serially_reusable de empaquetar y su cuerpo.

+1

¿qué hace, por qué es esto una solución? por favor elabora – TecHunter

Cuestiones relacionadas