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_product
i una funcióget_product_name
. - Cos del Paquet: Implementa el procediment
add_product
per inserir un producte en una taulaproducts
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
- Especificació del Paquet: Afegeix una funció
count_products
que retorna el nombre total de productes. - Cos del Paquet: Implementa la funció
count_products
per 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