Saltar al contenido principal
Página

Tema 4.3 - Paquetes

Un paquete es una agrupación de funciones, procedimientos, variables, cursores, entre otros, que clasifican a los subprogramas de acuerdo con una categoría elegida por el programador o diseñador.

Un paquete se compone de dos partes:

  1. Especificación: Es la interfaz con las aplicaciones en donde se declaran los tipos, variables, excepciones y subprogramas (funciones, procedimientos almacenados, triggers y subprogramas en bloques anónimos) a los que se pueden acceder desde fuera del paquete. En la especificación no se implementa el código de los subprogramas.
  2. Cuerpo: Es donde se implementa lo que se declaró inicialmente en la especificación, es decir, que en esta sección escribimos el código de los subprogramas.

Notas:

  1. Todos los objetos (procedimientos almacenados, funciones, variables, triggers, constantes, cursores, etc) declarados en la especificación son conocidos como objetos públicos. Las variables públicas no solo pueden ser accedidas sino también modificadas desde afuera del paquete.
  2. En el cuerpo de un paquete se pueden declarar nuevos objetos, pero estos serán privados, es decir, que solo podrán ser accedidos desde el mismo cuerpo. Si se desea ver el valor de una variable privada desde afuera del cuerpo, se debe crear un subprograma público a través del cual se acceda.
  3. Para acceder a los elementos declarados en un paquete, basta con poner el nombre del paquete donde está declarado, el nombre del objeto referenciado y un punto, de esta manera: nombre_paquete.objeto.
  4. - Para referenciar objetos desde adentro del mismo paquete donde han sido declarados no es necesario especificar el nombre del paquete y pueden (deberían) ser referenciados directamente por su nombre.
  5. La especificación del paquete es obligatoria, mientras que su cuerpo es opcional.

En los paquetes es posible tener varios subprogramas con el mismo nombre (sobrecarga de subprogramas) siempre y cuando difieran en los tipos y cantidad de parámetros; sin embargo, para evitar ambigüedades, se recomienda usar nombres distintos para los subprogramas.

A continuación, se muestra la sintaxis para la especificación y cuerpo de los paquetes.

Donde:

  1. Los corchetes representan las partes opcionales del código.
  2. La cláusula REPLACE sobre escribe el paquete si existe.
  3. Las cláusulas IS y AS son equivalentes.
  4. Dentro del cuerpo del paquete los subprogramas privados se deben implementar antes que los públicos.

Los paquetes nos ofrecen ciertas ventajas como:

  1. Nos permite encapsular elementos relacionados entre sí (variables, funciones, procedimientos almacenados, etc.) en un único módulo PL/SQL que llevará un nombre que identifique la funcionalidad del conjunto.
  2. Permite que varios procedimientos almacenados o funciones declaradas dentro de un paquete, tengan el mismo nombre (sobrecarga de subprogramas).
  3. Permite ocultar los detalles de implementación porque se puede especificar cuáles variables y subprogramas dentro del paquete son públicos (visibles y accesibles por otras aplicaciones y subprogramas fuera del paquete) o privados (ocultos e inaccesibles fuera del paquete).
  4. Introduce mejoras al rendimiento. Cuando un procedimiento o función que está definido dentro de un paquete es llamado por primera vez, todo el paquete es ingresado a memoria, por ende, si se vuelve a llamar el mismo u otros subprogramas dentro de ese paquete, se accederá en memoria en lugar de a disco. Esto no ocurre con los procedimientos almacenados y funciones estándares.

Ejemplo:

En un script vamos a escribir el código PL/SQL para la especificación y luego en otro, crearemos el cuerpo de nuestro paquete que va a tener como nombre mi_paquete.

Ahora procedemos a ejecutar ambos scripts para que queden guardados en nuestra base de datos.

Para tener más certeza de que se crearon la especificación y cuerpo del paquete podemos revisar en nuestra base de datos la carpeta Paquetes en donde nos debería aparecer ambas partes.

Después en otro script ponemos el siguiente bloque PL/SQL para ver si nuestro paquete funciona.

Si ejecutamos el código anterior nos muestra el siguiente resultado en pantalla:

El código funciona correctamente porque la variable a y la función get_b fueron declaradas en la especificación del paquete haciendo que sean públicas y permitiendo que puedan ser accedidas desde afuera del paquete.

Ahora comentemos las dos primeras líneas de impresión y quitamos los comentarios de las dos últimas líneas.

Corremos el siguiente código y arrojará error.

El error se da debido a que la variable b y el procedimiento incrementar_b fueron declarados e implementados en el cuerpo, haciendo que estos sean objetos privados y solo puedan ser accedidos dentro del mismo cuerpo del paquete.

Última modificación: lunes, 11 de mayo de 2020, 21:14