|
PLSQL - Cuando usar paquetes (y cuando no) |
|
|
Cuando usar PAQUETES y cuando no hacerlo
Uno de los elementos más importantes y útiles de PL/SQL, son los paquetes ("packages"). En general, es recomendable empaquetar el código PL/SQL, evitando el uso de funciones y procedimientos aislados.
Las ventajas que propociona el uso de paquetes son muchísimas:
-
Agrupa elementos relacionados, haciéndolos mucho más manejables.
-
Separa la especificación de la implementación (interfaz), de modo que si sólo cambio la implementación (dejando intacto el interfaz) no tendré que recompilar el código (otros paquetes) que hace uso del paquete en cuestión. Sólo los cambios en la especificación, provocarán la recompilación de otros elementos relacionados.
-
Define una parte pública (especificación) y otra privada (variables, funciones y procedimientos del cuerpo que no se han indicado en la especificación); ocultando complejidad, abstrayendo al desarrollador que lo usa de los detalles innecesarios, e incorporando seguridad.
-
Las variables a nivel de paquete, son persistentes durante cada sesión (sólo para dicha sesión); incluso cuando el código que las usa termina su ejecución. Por tanto, podemos declarar una variable en la especificación de un paquete; de modo que un usuario autorizado se conecte y consulte su valor desde un procedimiento; y en la misma sesión, ejecute otro procedimiento que consulte la misma variable, observando el valor que quedó anteriormente, y pudiendo cambiarlo, claro. Dicho valor no lo verán otras sesiones.
- Un paquete, en su implementación, además de variables, funciones y procedimientos, puede incluir un cuerpo (begin ... exception ... end), que sirva como código de inicialilzación del mismo (interesante para asignar un valor inicial a las variables del paquete). Es recomendable incluir dicho código en un procedimiento privado del paquete (por ejemplo llamado "inicializar"), y llamarlo en el cuerpo; facilitando así la depuración de errores.
El único caso en que puede suponer un problema usar paquetes, es cuando tenemos una función/procedimiento cuya lógica no cambia, que se usa en muchas partes de mi aplicación y, está ubicada dentro de un paquete que contiene otros elementos cuya lógica cambia con frecuencia. Esto hace que cada cambio en la implementación del paquete suponga recompilar todos aquellos elementos de mi aplicación que usan la función (aunque el cuerpo de la misma realmente no haya cambiado). Para evitar ésto:
-
Aislaremos y separaremos aquellas funcionalidades que raramente sufran cambios, de aquellas partes de mi aplicación que se modifiquen con frecuencia. Esto lo podemos hacer con un conjunto pequeño de funciones/procedimientos aislados (no empaquetados), o con un paquete que los agrupe.
- Si nuestros paquetes incluyen constantes en la especificación, que pueden cambiar con cierta frecuencia, y queremos evitar recompilaciones de los paquetes que las usan, podemos sustituir cada constante por una función que nos devuelva el valor.
En la Oracle Magazine de Mayo/Junio de 2005 hay un artículo muy interesante que habla de este tema, cuya lectura te recomiendo.
Fecha de publicación: 23/06/2005
Autor: Juan Luis Serradilla Amarilla. juanlu@um.es |
|
Última modificación ( 17.08.2006 )
|