|
Este error "ORA-4068" se produce en las sesiones que están usando un paquete, cuando se recompila el BODY de dicho paquete (y dicho BODY incluye variables globales).
Ejemplo:
CREATE OR REPLACE
PACKAGE PQ_PRUEBA1 AS
procedure pr01;
END PQ_PRUEBA1;
CREATE OR REPLACE
PACKAGE BODY PQ_PRUEBA1 AS
wcnt number(6);
procedure pr01 AS
BEGIN
wcnt:=nvl(wcnt,0)+1;
dbms_output.put_line('Contador = '||to_char(wcnt));
END pr01;
END PQ_PRUEBA1;
En el paquete del ejemplo se observa la variable global WCNT definida en el BODY. Aquellas sesiones que hayan ejecutado alguna vez dicho paquete, si vuelven a hacerlo después de que dicho BODY sea recompilado por algún cambio, obtendrán un error ORA-4068:
SQL> set serveroutput on
SQL> exec pq_prueba1.pr01
Contador = 1
PL/SQL procedure successfully completed.
SQL> exec pq_prueba1.pr01
Contador = 2
PL/SQL procedure successfully completed.
SQL> exec pq_prueba1.pr01
BEGIN pq_prueba1.pr01; END;
*
ERROR at line 1:
ORA-04068: existing state of packages has been discarded
ORA-04061: existing state of package body "JUANLU.PQ_PRUEBA1" has been invalidated
ORA-04065: not executed, altered or dropped package body "JUANLU.PQ_PRUEBA1"
ORA-06508: PL/SQL: could not find program unit being called: "JUANLU.PQ_PRUEBA1"
ORA-06512: at line 1
En el ejemplo anterior se puede ver como el procedimiento PQ_PRUEBA1.PR01 se ejecuta sin problemas la primera vez (Contador = 1) y la 2ª (Contador = 2), pero en la 3ª el BODY ha sido recompilado y aparece el temido ORA-4068. En el caso de una sesión CONECTADA (como puede ser una aplicación C/S con FORMS), si el usuario vuelve a ejecutar el proceso, funcionará perfectamente, pero si se trata de una aplicación WEB la sesión del pool de conexiones q obtuvo el error se quedará bloqueada, de modo que si dicho error sigue sucediendo para el resto de conexiones del pool, llegará un momento en que no se pueda usar ninguna sesión del citado pool, y la única solución sea REINICIAR la aplicación web.
Por tanto los errores ORA-4068 pueden hacer que una aplicación WEB quede inaccesible.
Para evitar los errores ORA-4068, aquellos que seáis responsables de paquetes PL/SQL que son usados por otras aplicaciones, si dichos paquetes tienen declaradas variables en la parte común del BODY, antes de recompilar los citados paquetes tenéis que avisar de modo que los responsables de las aplicaciones clientes den su visto bueno al horario propuesto para la recompilación, o al menos tengan un tiempo prudencial que les permita reaccionar.
FAQs:
¿Hay algo que puedan hacer aquellos que CREAN los citados paquetes para evitar el ORA-4068?
Sí, hay varias opciones que se deben valorar:
- Evitar, en la medida de lo posible, el uso de variables globales en el BODY.
- Si el paquete es usado por una aplicación web, deben diseñar el paquete pensando en que el ámbito del paquete es una sola llamada, y NO una sesión, haciendo que las variables globales no sean necesarias más allá de una sola llamada al paquete. Esto se puede ASEGURAR incluyendo "PRAGMA SERIALLY_REUSABLE" tanto en la especificación del paquete como en el BODY, de modo que el "estado" del paquete se reiniciará cada vez que se llame a dicho paquete.
¿Hay algo que puedan hacer aquellos que desarrollan aplicaciones web que, a su vez, actúan de clientes de los citados paquetes con variables globales en el BODY?
Sí, para evitar el ORA-4068 pueden reiniciar el estado del paquete para dicha sesión haciendo la llamada "dbms_session.modify_package_state(dbms_session.reinitialize);", un paquete de Oracle que "limpiará" la sesión evitando cualquier ORA-4068 que se pueda producir. NO uses el procedimiento "reset_package" pues BORRA el estado, de modo q se tiene q volver la siguiente vez, sin embargo, "modify_package_state" sólo RESETEA dicho estado (poniendo un ejemplo análogo con objetos, "reset_package" borraría el objeto, mientras q "modify_package_state" sólo lo dejaría a NULL o con su valor inicial).
La forma mas "limpia" de llamar al "reinitialize" puede ser hacerlo desde dentro de un paquete de la aplicación que actúa como cliente (del paquete que puede provocar el ORA-4068).
Enlaces:
|