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
- Especificació del Paquet: Declara un procediment
add_producti una funcióget_product_name. - Cos del Paquet: Implementa el procediment
add_productper inserir un producte en una taulaproductsi la funcióget_product_nameper 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
- Especificació del Paquet: Afegeix una funció
count_productsque retorna el nombre total de productes. - Cos del Paquet: Implementa la funció
count_productsper comptar el nombre de productes a la taulaproducts.
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.
Curs de PL/SQL
Mòdul 1: Introducció a PL/SQL
Mòdul 2: Fonaments de PL/SQL
- Estructura del bloc PL/SQL
- Variables i tipus de dades
- Estructures de control
- Cursors
- Gestió d'excepcions
