Els paquets en PL/SQL són una manera d'organitzar i encapsular el codi PL/SQL en unitats lògiques. Un paquet consta de dues parts principals: l'especificació (spec) i el cos (body). L'especificació declara els tipus, variables, constants, excepcions, procediments i funcions que són accessibles des de fora del paquet. El cos conté la implementació d'aquests procediments i funcions.

Avantatges dels Paquets

  • Modularitat: Faciliten l'organització del codi en unitats lògiques.
  • Reutilització: Permeten reutilitzar el codi en diferents parts de l'aplicació.
  • Rendiment: Milloren el rendiment reduint la càrrega de compilació.
  • Seguretat: Permeten controlar l'accés a les dades i funcions.

Estructura d'un Paquet

Especificació del Paquet

L'especificació del paquet declara els elements que seran accessibles des de fora del paquet.

CREATE OR REPLACE PACKAGE my_package IS
  -- Declaració de tipus
  TYPE t_employee IS RECORD (
    emp_id NUMBER,
    emp_name VARCHAR2(100)
  );

  -- Declaració de constants
  c_max_employees CONSTANT NUMBER := 100;

  -- Declaració de variables
  v_total_employees NUMBER;

  -- Declaració de procediments i funcions
  PROCEDURE add_employee(p_emp_id NUMBER, p_emp_name VARCHAR2);
  FUNCTION get_employee(p_emp_id NUMBER) RETURN t_employee;
END my_package;
/

Cos del Paquet

El cos del paquet conté la implementació dels procediments i funcions declarats a l'especificació.

CREATE OR REPLACE PACKAGE BODY my_package IS
  -- Implementació del procediment add_employee
  PROCEDURE add_employee(p_emp_id NUMBER, p_emp_name VARCHAR2) IS
  BEGIN
    -- Codi per afegir un empleat
    v_total_employees := v_total_employees + 1;
    DBMS_OUTPUT.PUT_LINE('Empleat afegit: ' || p_emp_name);
  END add_employee;

  -- Implementació de la funció get_employee
  FUNCTION get_employee(p_emp_id NUMBER) RETURN t_employee IS
    l_employee t_employee;
  BEGIN
    -- Codi per obtenir un empleat
    l_employee.emp_id := p_emp_id;
    l_employee.emp_name := 'Nom de prova'; -- Aquí aniria una consulta a la base de dades
    RETURN l_employee;
  END get_employee;
END my_package;
/

Exemple Pràctic

Crear el Paquet

CREATE OR REPLACE PACKAGE employee_pkg IS
  PROCEDURE add_employee(p_emp_id NUMBER, p_emp_name VARCHAR2);
  FUNCTION get_employee(p_emp_id NUMBER) RETURN VARCHAR2;
END employee_pkg;
/

Crear el Cos del Paquet

CREATE OR REPLACE PACKAGE BODY employee_pkg IS
  PROCEDURE add_employee(p_emp_id NUMBER, p_emp_name VARCHAR2) IS
  BEGIN
    -- Suposem que tenim una taula EMPLOYEES amb columnes EMP_ID i EMP_NAME
    INSERT INTO employees (emp_id, emp_name) VALUES (p_emp_id, p_emp_name);
    COMMIT;
  END add_employee;

  FUNCTION get_employee(p_emp_id NUMBER) RETURN VARCHAR2 IS
    l_emp_name VARCHAR2(100);
  BEGIN
    SELECT emp_name INTO l_emp_name FROM employees WHERE emp_id = p_emp_id;
    RETURN l_emp_name;
  END get_employee;
END employee_pkg;
/

Utilitzar el Paquet

BEGIN
  -- Afegir un empleat
  employee_pkg.add_employee(1, 'John Doe');

  -- Obtenir el nom d'un empleat
  DBMS_OUTPUT.PUT_LINE(employee_pkg.get_employee(1));
END;
/

Exercicis Pràctics

Exercici 1: Crear un Paquet per Gestionar Productes

  1. Especificació del Paquet: Declara un procediment add_product i una funció get_product_name.
  2. Cos del Paquet: Implementa el procediment add_product per inserir un producte en una taula products i la funció get_product_name per retornar el nom d'un producte donat el seu ID.

Solució

-- Especificació del Paquet
CREATE OR REPLACE PACKAGE product_pkg IS
  PROCEDURE add_product(p_prod_id NUMBER, p_prod_name VARCHAR2);
  FUNCTION get_product_name(p_prod_id NUMBER) RETURN VARCHAR2;
END product_pkg;
/

-- Cos del Paquet
CREATE OR REPLACE PACKAGE BODY product_pkg IS
  PROCEDURE add_product(p_prod_id NUMBER, p_prod_name VARCHAR2) IS
  BEGIN
    INSERT INTO products (prod_id, prod_name) VALUES (p_prod_id, p_prod_name);
    COMMIT;
  END add_product;

  FUNCTION get_product_name(p_prod_id NUMBER) RETURN VARCHAR2 IS
    l_prod_name VARCHAR2(100);
  BEGIN
    SELECT prod_name INTO l_prod_name FROM products WHERE prod_id = p_prod_id;
    RETURN l_prod_name;
  END get_product_name;
END product_pkg;
/

Exercici 2: Ampliar el Paquet amb una Funció de Comptatge

  1. Especificació del Paquet: Afegeix una funció count_products que retorna el nombre total de productes.
  2. Cos del Paquet: Implementa la funció count_products per comptar el nombre de productes a la taula products.

Solució

-- Especificació del Paquet
CREATE OR REPLACE PACKAGE product_pkg IS
  PROCEDURE add_product(p_prod_id NUMBER, p_prod_name VARCHAR2);
  FUNCTION get_product_name(p_prod_id NUMBER) RETURN VARCHAR2;
  FUNCTION count_products RETURN NUMBER;
END product_pkg;
/

-- Cos del Paquet
CREATE OR REPLACE PACKAGE BODY product_pkg IS
  PROCEDURE add_product(p_prod_id NUMBER, p_prod_name VARCHAR2) IS
  BEGIN
    INSERT INTO products (prod_id, prod_name) VALUES (p_prod_id, p_prod_name);
    COMMIT;
  END add_product;

  FUNCTION get_product_name(p_prod_id NUMBER) RETURN VARCHAR2 IS
    l_prod_name VARCHAR2(100);
  BEGIN
    SELECT prod_name INTO l_prod_name FROM products WHERE prod_id = p_prod_id;
    RETURN l_prod_name;
  END get_product_name;

  FUNCTION count_products RETURN NUMBER IS
    l_count NUMBER;
  BEGIN
    SELECT COUNT(*) INTO l_count FROM products;
    RETURN l_count;
  END count_products;
END product_pkg;
/

Resum

En aquesta secció, hem après què són els paquets en PL/SQL, els avantatges que ofereixen i com crear-los i utilitzar-los. Hem vist exemples pràctics de com declarar i implementar paquets, així com exercicis per reforçar els conceptes apresos. Els paquets són una eina poderosa per organitzar i encapsular el codi PL/SQL, millorant la modularitat, la reutilització i el rendiment del codi.

© Copyright 2024. Tots els drets reservats