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

ORA-04061:el estado existente del cuerpo del paquete PACKAGE.NAME ha sido invalidado y persiste

Oracle hace esto porque la recompilación de un paquete PL/SQL invalida cualquier variable de sesión en uso.

No hay mucho que podamos hacer para evitar esto, excepto mediante el uso de buenas prácticas de implementación. No implemente cambios mientras la base de datos está en uso, asegúrese de que todas las conexiones estén correctamente desconectadas, etc. Es más fácil decirlo que hacerlo en esta era de CI/CD, tiempo de inactividad cero y otras innovaciones interesantes.

Así que hay una cosa en la parte de atrás del casillero:pragma serially_reusable; . Esta instrucción significa que el estado del paquete se mantiene durante una sola llamada al servidor . Por ejemplo, si tenemos un bloque PL/SQL que llama a un procedimiento SR tres veces, cualquier variable alterada por ese procedimiento mantendrá el valor principal en las tres llamadas. Pero la próxima vez que ejecutemos el bloque, en la misma sesión, las variables se habrán restablecido a sus valores iniciales.

Hay varias limitaciones para PL/SQL reutilizable en serie; por ejemplo, no se puede usar en consultas SQL. Pero la gran atracción desde su perspectiva son los errores ORA-04068 u ORA-04061. Sin estado de sesión, nada que invalidar.

pragma serially_reusable debe declararse a nivel de paquete y en el cuerpo, así como en la especificación. Por lo tanto, debe asegurarse de que ninguno de los procedimientos empaquetados necesite mantener el estado en las llamadas del servidor.