lunes, 24 de noviembre de 2014

Paquetes en PLSQL

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;

No hay comentarios:

Publicar un comentario