Paquetes en PL/SQL
# Paquetes en PL/SQL

Los paquetes en PL/SQL tienen el objetivo de agrupar procedimientos y funciones de forma lógica. De esta manera, se consigue agrupar en un único objeto, toda la casuística asociada a un determinado tipo de tarea. Por ejemplo, si tenemos un conjunto de procedimientos y funciones para realizar cálculos matemáticos complejos, los podemos poner en un paquete.

La ventaja de los paquetes es que la primera vez que se invoca, es cargado en memoria, por lo que las siguientes veces ya no será necesario hacerlo de nuevo. Además, el paquete mantiene una copia en memoria para todos los usuarios. Otra ventaja, es que podemos encapsular procedimientos y funciones que no forman parte de la interfaz de usuario. Podemos ocultar ciertos objetos y solo hacer públicos los que se necesiten. También se permite la sobrecarga dentro de los paquetes. El paquete se divide en especificación y cuerpo.

## Especificación

Es obligatorio en la creación de un paquete (PACKAGE). Se declaran todos los subprogramas públicos. Lo lógico es declarar en esta sección aquellos procedimientos o funciones que actúan como interfaz. También se declaran las variables o constantes que se quieren tratar como globales y que se puedan cambiar o referenciar fuera del paquete.

La sintaxis sería la siguiente:

## Cuerpo

En el cuerpo es donde se definen los procedimientos y funciones públicos y privados.

La sintaxis sería:

Para realizar llamadas a objetos dentro de un paquete, habría que diferenciar si la llamada es desde un subprograma dentro del mismo paquete o si la llamada es externa al paquete:

* Llamada interna

    Se pone el nombre del subprograma y entre paréntesis los parámetros que se deben pasar.
    Por ej. para llamar a la función "Multiplica(real r1, real r2)" desde la función "CalculaBeneficios", se pondría "r3:= Multiplica(2.5,3.5)"
* Llamada externa

    Hay que preceder el nombre del paquete al nombre del procedimiento o función. Además, el subprograma llamado debe ser público para que pueda ser referenciado.
    Por ejemplo para llamar a la función Multiplica que se encuentra en el paquete "OperacionesMatematicas" desde un procedimiento externo al paquete sería "r3:= OperacionesMatematicas.Multiplica(2.5,3.5)"

Para eliminar un paquete de la base de datos tanto la especificación como el cuerpo:

Oracle proporciona algunos paquetes que permiten la realización de distintas tareas muy comunes al desarrollar o administrar la base de datos. Entre estos paquetes se pueden destacar:

* DBMS_SQL: para acceder a la base de datos con SQL dinámico.
* DBMS_UTILITY: para el análisis de objetos. Por ejemplo se pueden compilar todos los objetos que se encuentran en un determinado esquema de base de datos.
* UTL_FILE: añade capacidades de entrada/salida a ficheros.
* Datos: Q6060311
