Una de las tareas que me gustaría ahorrarme cuando estoy trabajando es tener que recompilar los paquetes que se descompilan cuando compilo algo. Cuando compilas un paquete que está referenciado por otro paquete, este segundo queda inválido. Imaginad en un entorno real en el que puedes tener varias decenas de paquetes con referencias en cascada lo que pasa cuando compilas algo más o menos céntrico. Al principio tenía un script para hacer un “ALTER PACKAGE fulano COMPILE“. El problema es que esto casi es como volver a compilar el paquete, con lo cual hay más descompilaciones en cadena. Más adelante incluí en cada paquete un procedimiento como este:
1 2 3 4 | PROCEDURE Compila IS BEGIN NULL; END; |
Me hice un script que para llamase al procedimiento “Compila()” de cada paquete invalidado. De esta manera Oracle revalida el paquete que sin haya descompilaciones en cadena. Hoy, en mi lector de feeds casi lloro de la emoción al ver un artículo del semidiox Tom titulado Compile procedure automatically — how to avoid cascading invalidations. Qué desilusión me he llevado al leerlo. Lo único que le ha dicho al askeador es que use paquetes en lugar de procedimientos. Tendré que seguir usando mi cutrescript.
December 4th, 2007 at 2:52 pm
Puede que ya lo conozcas y no te guste (el tema de las invalidaciones en cascada, las tendrás igual), pero el procedimiento DBMS_UTILITY.COMPILE_SCHEMA va bastante bien, te dejo la URL de la documentación oficial de Oracle sobre éste paquete.
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_util.htm#i1002332
Saludos.
January 10th, 2008 at 5:39 am
Eres uno de los escogidos el juego de la blogosfera de Oracle para mas información puedes ir a
http://oracleradio.blogspot.com/2008/01/mis-8-cosasel-juego-de-la-blogosfera-de.html
Saludos
January 11th, 2008 at 8:06 am
Hola Sir Garañon,
Este problema no nada mas se presenta cuando compilas paquetes/procedimientos, si no que también cuando haces cambios a objetos referenciados por el pkg/prod. Se “supone” que Oracle recompila de manera automática el código a menos que exista un error en alguno de los pkg/procs de la cadena.
Aunque aquí lo menciona para código nativo, funciona igual para el no nativo.
“Recompilation is automatic with invalidated PL/SQL modules. For example, if an object on which a natively compiled PL/SQL subprogram depends changes, the subprogram is invalidated. The next time the same subprogram is called, the database recompiles the subprogram automatically.”
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/tuning.htm#sthref2283
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:3786863562434