Pregunta

El escenario que creó esta pregunta:

Tenemos un paquete que es una dependencia de otro paquete, que a veces realiza cambios en el " padre " paquete hace que el paquete dependiente se convierta en inválido, pero a veces no lo hace.

Nos ha sorprendido antes.

Sería muy útil entender las causas de la invalidación para poder predecir / planificar para ello.

¿Fue útil?

Solución

El cambio de cualquier objeto en el que se base un paquete (por ejemplo, tablas, vistas, activadores, otros paquetes) marcará automáticamente el paquete como no válido. Como señala tuinstoel arriba, Oracle es lo suficientemente inteligente como para recompilar el paquete cuando se usa por primera vez.

Si le preocupa esto, cada vez que realice cambios de esquema (por ejemplo, tablas, vistas, activadores, procedimientos), ejecute un DBMS_UTILITY.compile_schema (o haga que su DBA lo haga). Esto forzará la compilación de todos los paquetes y le permitirá saber dónde, o si hay errores antes de encontrarlos de la manera más difícil.

Otros consejos

O puede consultar la siguiente tabla para ver qué dependencias tiene

   select *
   from dba_dependencies
   where name = 'YOUR_PACKAGE'
   and referenced_owner = 'ANYUSER' --- Comment this out if you are looking for yourself
   and owner = USER --- Or can be set to any user

Esto mostrará todas las dependencias. Para su consulta de objetos user_dependencies.

Por cierto, si estoy completamente equivocado acerca de la situación ... disculpas por adelantado

¿Atrapado por sorpresa?

No estoy seguro de cuáles son las implicaciones de eso ...

¿Se rompió algo en la producción?

¿Qué pasó EXACTAMENTE?

La razón por la que pregunto es porque entender las posibles ramificaciones de un cambio es mucho más difícil que lidiar con el resultado. ¿Por qué la invalidación se convierte en un problema? Supongo que se debe a que se ha descartado un " Estado existente del paquete " Error en su aplicación. ¿Es ese el problema REAL ?

Nuevamente, sospecho que es y, de ser así, tratemos con eso en lugar de la lista de cambios que, como he incluido en un comentario, es específico de la versión. (11g rastrea la dependencia hasta la columna de una tabla en lugar de la tabla en su totalidad, por ejemplo).

Esto puede no parecerle un error importante si no está utilizando el estado del paquete. Si fueras, esto sería un error importante y no te habrías sorprendido, así que supongo que no.

Ya que no estás, este error está bien para ignorar. Ya que puede ignorarlo de manera segura, puede codificar su aplicación cliente para ignorar este error y reintentar su llamada, porque, como otros han señalado, Oracle recompilará su paquete por usted. Este es un ejercicio que vale la pena. Porque en lugar de saber todas las cosas posibles de las que debe preocuparse cuando realiza un cambio, y luego, en la solución de emergencia, olvida uno de ellos, su aplicación solo lo manejará y seguirá adelante, sin preocupaciones.

Estoy de acuerdo con Thomas Jones-Low, sin embargo, hay un par de problemas más que ver con las sesiones largas y la recompilación.

Si hace referencia a un paquete en una sesión y ese paquete (o un paquete dependiente) se vuelve a compilar durante la misma sesión, entonces obtendrá un error de Oracle " ORA-06508: PL / SQL: no se pudo encontrar la unidad de programa que se está llamando " ;

Una vez que ha hecho referencia al paquete en una sesión, generalmente no puede cambiar el paquete sin invalidarla para esa sesión. Este es un problema particular para los entornos de desarrollo donde los paquetes cambian con frecuencia, pero también es un problema para los entornos de producción donde desea hacer un pequeño parche sin desarmar todo el entorno. Tenga en cuenta que este error se producirá incluso cuando no haya errores en los paquetes modificados.

Además de la respuesta de Thomas Jones-Low, si solo modifica el paquete BODY, es posible que un objeto dependiente no se marque como no válido.

Sin embargo, tan pronto como modifiques la especificación del paquete, eso sucederá.

Si intenta ejecutar un paquete de Oracle no válido, Oracle intentará compilarlo. Solo cuando permanezca inválido después de compilar Oracle lanzará una excepción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top