Inicio > Oracle > PL/SQL – Paquetes ORACLE

PL/SQL – Paquetes ORACLE


Uno de los elementos más importantes son los paquetes («packages»). En general, es recomendable empaquetar el código PL/SQL, evitando el uso de funciones y procedimientos aislados.

Aqui las principales ventajas que propociona el uso de paquetes :

• Agrupa elementos relacionados, haciéndolos mucho más manejables.
• 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.

El siguiente fragmento de código se muestra la creacion de un package con un unico procedimiento. Puede tener muchas variables globales definidas y múltiples procedimientos o funciones dentro de un paquete.

CREATE PACKAGE CLIENTES_SALARIO AS
PROCEDURE BUSCAR_SALARIO(c_id CLIENTES.ID%type);
END CLIENTES_SALARIO;
/

Package Body – Cuerpo del paquete

CREATE OR REPLACE PACKAGE BODY CLIENTES_SALARIO AS
PROCEDURE BUSCAR_SALARIO(c_id CLIENTES.ID%TYPE) IS
c_sal CLIENTES.SALARIO%TYPE;
BEGIN
SELECT SALARIO INTO c_sal
FROM CLIENTES
WHERE ID = c_id;
dbms_output.put_line(‘SALARIO: ‘|| c_sal);
END BUSCAR_SALARIO;
END CLIENTES_SALARIO;
/

Paquetes001

Utilizando los elementos del paquete :
Los elementos del paquete (variables, procedimientos o funciones) se accede con la siguiente sintaxis:

Paquetes002

SET SERVEROUTPUT ON SIZE 1000000;
DECLARE
code CLIENTES.ID%type := &cc_id;
BEGIN
CLIENTES_SALARIO.BUSCAR_SALARIO(code);
END;
/

Paquetes003

 

Ejemplo:
El siguiente programa ofrece un paquete más completo. Usaremos la tabla CLIENTES almacenada en nuestra base de datos con los siguientes registros:

Paquetes004

Creamos el siguiente paquete :

CREATE OR REPLACE PACKAGE CLIENTES_Package AS

— Agregar Cliente
PROCEDURE NuevoCliente(c_id   CLIENTES.ID%type,
c_nombre     CLIENTES.NOMBRE%type,
c_edad       CLIENTES.EDAD%type,
c_direccion  CLIENTES.DIRECCION%type,
c_salario    CLIENTES.SALARIO%type);

   — Eliminar Cliente
PROCEDURE EliminarCliente(c_id  CLIENTES.ID%TYPE);

   — Listar Cliente
PROCEDURE ListarClientes;

END CLIENTES_Package;
/

Paquetes005

CREACIÓN DEL CUERPO DEL PAQUETE:

CREATE OR REPLACE PACKAGE BODY CLIENTES_Package AS
PROCEDURE NuevoCliente(c_id  CLIENTES.ID%type,
c_nombre     CLIENTES.NOMBRE%type,
c_edad       CLIENTES.EDAD%type,
c_direccion  CLIENTES.DIRECCION%type,
c_salario    CLIENTES.SALARIO%type)
   IS
   BEGIN
      INSERT INTO CLIENTES (ID,NOMBRE,EDAD,DIRECCION,SALARIO)
VALUES(c_id, c_nombre, c_edad, c_direccion, c_salario);
END NuevoCliente;

PROCEDURE EliminarCliente(c_id   CLIENTES.ID%type) IS
   BEGIN
       DELETE FROM CLIENTES
         WHERE ID = c_id;
END EliminarCliente;

PROCEDURE ListarClientes IS

CURSOR c_Clientes IS
SELECT NOMBRE FROM CLIENTES;

TYPE c_List IS TABLE OF CLIENTES.NOMBRE%type;
lista_nombres c_List := c_List();

contador integer :=0;
BEGIN
      FOR n IN c_Clientes LOOP
contador := contador +1;
lista_nombres.extend;
lista_nombres(contador)  := n.nombre;
dbms_output.put_line(‘Cliente (‘ ||contador|| ‘)’||lista_nombres(contador));
     END LOOP;
END ListarClientes;

END CLIENTES_Package;
/

Paquetes006

USO DEL PAQUETE:
El siguiente programa utiliza los métodos declarados y definidos en CLIENTES_Package

DECLARE
code CLIENTES.ID%type:= 8;
BEGIN
CLIENTES_Package.NuevoCliente(7, ‘Liliana‘, 25, ‘Aquino‘, 3500);
CLIENTES_Package.NuevoCliente(8, ‘Victor‘, 32, ‘Huaman‘, 7500);
CLIENTES_Package.ListarClientes ;
CLIENTES_Package.EliminarCliente(code);
CLIENTES_Package.ListarClientes ;
END;
/

Paquetes007

logo shipment4you 342 68 PNG ESP WEB

Categorías: Oracle
  1. No hay comentarios aún.
  1. No trackbacks yet.

Deja un comentario