Los paquetes(packages) en PLSQL tienen el objetivo de agrupar
procedimientos y funciones de forma lógica. De esta manera, se agrupa en un
único objeto, toda la lógica asociada a una determinada 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. Podemos ocultar ciertos objetos y
solo hacer públicos los que se necesiten. Al crear procesos y funciones podemos
testear su funcionamiento para validar su lógica. El paquete se divide en
especificación y cuerpo.
Especificación
Es obligatorio en la creación
de un paquete. 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:
CREATE OR REPLACE PACKAGE PAQUETE_NOMBRE AS
VAR_GLOBAL1 VARCHAR2(30);
VAR_GLOBAL2 NUMBER;
PROCEDURE Proceso_1(var1 NUMBER,
var2 VARCHAR2,
var3 DATE,
v_message OUT VARCHAR2);
FUNCTION Funcion_1(var1 NUMBER, var2 VARCHAR2) RETURN BOOLEAN;
END PAQUETE_NOMBRE;
Cuerpo
En el cuerpo es
donde se definen los procedimientos y funciones públicos y privados. La sintaxis sería:
CREATE OR REPLACE PACKAGE PAQUETE_NOMBRE AS
PROCEDURE Proceso_1(var1 NUMBER,
var2 VARCHAR2,
var3 DATE,
v_message OUT VARCHAR2) is
BEGIN
if var3<sysdate then
v_message := 'Datos:
' || var1 || ' y ' || var2;
else v_message := 'Unico: ' || var1 ;
end if;
END;
FUNCTION Funcion_1(var1 NUMBER, var2 VARCHAR2) is
BEGIN
if var1=var2 then
return false;
else return true;
end if;
END;
END PAQUETE_NOMBRE;
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 ejemplo para
llamar a la función Funcion_1 (3, 4) desde el proceso proceso_1, se pondría var5:= Funcion_1 (3, 4)
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 Funcion_1 que se encuentra en el paquete PAQUETE_NOMBRE desde un procedimiento externo al paquete sería var5:= PAQUETE_NOMBRE. Funcion_1 (3, 4)
Eliminar paquetes
Para eliminar un
paquete de la base de datos tanto la especificación como el cuerpo Debe usar la siguiente sintaxis:
DROP PACKAGE PAQUETE_NOMBRE;