
Vuelvo a la carga con uno de esos posts de alto calado social y gracias al cual más de uno verá sus pelotas salvadas. Eso si, para el pueblo llano será totalmente irrelevante, así que no espero más de 40-50 comentarios de primeras. Aunque ese número se verá incrementado de manera exponencial en los próximos meses, en cuanto el tito Google vea necesario posicionarme en primera línea de resultados. Será en ese momento cuando los comentarios puedan llegar a cotas inimaginables por mente humana, femenina o animal, calculo que unos 60.
Os pongo en antecedentes. Hace ya un par de años se decidió en mi proyecto basar toda la programación de las pantallas en paquetes de base de datos, la lógica del negocio o algo así que lo llamarán los que se dan que saben mucho pero luego resulta que saben mucho. Eso llevó a tener que reprogramarlo todo… y aparecieron unos mensajitos megamolones.
El problema viene cuando recompilas un paquete de base de datos, en adelante paquete de base de datos, y, se haya cambiado código o no, aparentemente queda todo bien. Pero vas a ejecutar alguna de sus funciones, sea desde formulario o desde SQL*Plus / TOAD… y aparecen estos mágicos errores:
ORA-04068: se ha anulado el estado existente de los paquetes.
ORA-04061: el estado existente de package body TACA ha sido invalidado.
ORA-04065: package body TACA no se ha ejecutado porque se ha modificado o borrado.
Pero luego ves que realmente está todo bien, no hay paquetes, funciones o procedimientos invalidados. Ni siquiera aunque haya dependencias entre ellos. ¿Qué falla?
Soluciones buscando por el insulso cyberespacio hay muchas y ninguna funciona. Al menos a mí no me ha servido ninguna. Ni usar EXECUTE INMEDIATE, ni hacer paquetes más pequeños, ni meter algún PRAGMA… nada.
En cambio hay algo que en principio si me ha funcionado, y digo en principio porque lo he probado en un paquete chorrísima con una única función, es posible que en alguno con miles de líneas de código salte de nuevo el error. Y la solución es quitar las variables globales del paquete. En cuanto hice esa prueba recompilé y recompilé los paquetes hasta la náusea y el error no volvió a aparecer. De hecho ni siquiera me sirvió mandar las variables a la especificación del paquete en lugar de tenerlas en el cuerpo. Tuve que fusilarlas completamente. Esto vino bien para ver qué estaba fallando, pero el paso siguiente ya es más peliagudo y de momento sin solución más o menos viable, pero eso ya es cuestión particular.
Al que le sirva pues guay, al que no y tenga alguna idea que me la exponga, acepto gustoso sugerencias y perras, ya sean físicas o carnales.
Añadir que esto está probado en:
Oracle9i Enterprise Edition Release 9.2.0.6.0 – 64bit
Oracle Database 10g Release 10.1.0.4.0
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 – 64bit
anónimo 00:37 am el 24 de Abril de 2012 Enlace permanente
He pasado aquí rebotando entre blogs así que te dejo una pequeña aportación! (espero no equivocarme)
^ -> lo que va a continuación tiene que ir al principio de la expresión regular, lo que hay entre corchetes
[a-zA-Z0-9._%-]+ cadena de caracteres con cualquiera de los valores que hay entre corchetes, es decir, cualquier letra mayus o minus, número, etc. El + expresa que como mínimo tiene que haber un caracter de los que hay entre corchetes pero que puede haber infinitos más.
@ -> obligación de que haya una @
[a-zA-Z0-9._%-]+ -> igual que lo anterior
\. -> obligación de que haya un .
[a-zA-Z]{2,4}$ debe haber entres 2 y 4 letras mayus o minus. El $ indica que lo que va entre corchetes debe estar al final de la cadena, para asegurarse que acaba ahí.
Un saludo
Raúl 22:55 pm el 26 de Abril de 2012 Enlace permanente
¿Y cuándo podemos darte las gracias? Por acordarme.
Tapanez 09:12 am el 2 de Mayo de 2012 Enlace permanente
Vaya, otra vez que la página no me avisa con su correspondiente correo de que me han llegado nuevos comentarios, ustedes disculpen.
Querido anónimo, muchas gracias por la aportación, en cuanto tenga un hueco la pruebo. Y muchas más gracias por la explicación :careto_nuts:
Raúl, puedes darme las gracias cuando quieras, pirata, yo te diré cómo.
Raúl 11:35 am el 4 de Mayo de 2012 Enlace permanente
¿Cómo?
Tapanez 12:42 pm el 4 de Mayo de 2012 Enlace permanente
Claro.