En aquesta secció, explorarem diversos estudis de cas que il·lustren com PL/SQL es pot utilitzar per resoldre problemes del món real. Aquests exemples pràctics t'ajudaran a comprendre millor com aplicar els conceptes apresos al llarg del curs en situacions reals.
Estudi de cas 1: Gestió d'inventari
Descripció del problema
Una empresa de comerç electrònic necessita gestionar el seu inventari de productes. Volen una solució que permeti:
- Actualitzar les quantitats de productes en estoc.
- Registrar les vendes i les devolucions.
- Generar informes d'inventari.
Solució amb PL/SQL
Estructura de la base de dades
CREATE TABLE productes ( id_producte NUMBER PRIMARY KEY, nom_producte VARCHAR2(100), quantitat_en_estoc NUMBER ); CREATE TABLE vendes ( id_venda NUMBER PRIMARY KEY, id_producte NUMBER, quantitat_venda NUMBER, data_venda DATE, FOREIGN KEY (id_producte) REFERENCES productes(id_producte) ); CREATE TABLE devolucions ( id_devolucio NUMBER PRIMARY KEY, id_producte NUMBER, quantitat_devolucio NUMBER, data_devolucio DATE, FOREIGN KEY (id_producte) REFERENCES productes(id_producte) );
Procediment per actualitzar l'inventari
CREATE OR REPLACE PROCEDURE actualitzar_inventari ( p_id_producte IN NUMBER, p_quantitat IN NUMBER ) IS BEGIN UPDATE productes SET quantitat_en_estoc = quantitat_en_estoc + p_quantitat WHERE id_producte = p_id_producte; END; /
Procediment per registrar una venda
CREATE OR REPLACE PROCEDURE registrar_venda ( p_id_producte IN NUMBER, p_quantitat IN NUMBER ) IS BEGIN INSERT INTO vendes (id_venda, id_producte, quantitat_venda, data_venda) VALUES (vendes_seq.NEXTVAL, p_id_producte, p_quantitat, SYSDATE); actualitzar_inventari(p_id_producte, -p_quantitat); END; /
Procediment per registrar una devolució
CREATE OR REPLACE PROCEDURE registrar_devolucio ( p_id_producte IN NUMBER, p_quantitat IN NUMBER ) IS BEGIN INSERT INTO devolucions (id_devolucio, id_producte, quantitat_devolucio, data_devolucio) VALUES (devolucions_seq.NEXTVAL, p_id_producte, p_quantitat, SYSDATE); actualitzar_inventari(p_id_producte, p_quantitat); END; /
Generació d'informes d'inventari
CREATE OR REPLACE PROCEDURE generar_informe_inventari IS CURSOR c_productes IS SELECT id_producte, nom_producte, quantitat_en_estoc FROM productes; BEGIN FOR r_producte IN c_productes LOOP DBMS_OUTPUT.PUT_LINE('ID Producte: ' || r_producte.id_producte); DBMS_OUTPUT.PUT_LINE('Nom Producte: ' || r_producte.nom_producte); DBMS_OUTPUT.PUT_LINE('Quantitat en Estoc: ' || r_producte.quantitat_en_estoc); DBMS_OUTPUT.PUT_LINE('-----------------------------'); END LOOP; END; /
Exercici pràctic
- Crea les taules
productes
,vendes
idevolucions
a la teva base de dades. - Implementa els procediments
actualitzar_inventari
,registrar_venda
iregistrar_devolucio
. - Insereix alguns productes a la taula
productes
. - Registra algunes vendes i devolucions.
- Executa el procediment
generar_informe_inventari
per veure l'estat actual de l'inventari.
Solució
-- Creació de les taules CREATE TABLE productes ( id_producte NUMBER PRIMARY KEY, nom_producte VARCHAR2(100), quantitat_en_estoc NUMBER ); CREATE TABLE vendes ( id_venda NUMBER PRIMARY KEY, id_producte NUMBER, quantitat_venda NUMBER, data_venda DATE, FOREIGN KEY (id_producte) REFERENCES productes(id_producte) ); CREATE TABLE devolucions ( id_devolucio NUMBER PRIMARY KEY, id_producte NUMBER, quantitat_devolucio NUMBER, data_devolucio DATE, FOREIGN KEY (id_producte) REFERENCES productes(id_producte) ); -- Procediment per actualitzar l'inventari CREATE OR REPLACE PROCEDURE actualitzar_inventari ( p_id_producte IN NUMBER, p_quantitat IN NUMBER ) IS BEGIN UPDATE productes SET quantitat_en_estoc = quantitat_en_estoc + p_quantitat WHERE id_producte = p_id_producte; END; / -- Procediment per registrar una venda CREATE OR REPLACE PROCEDURE registrar_venda ( p_id_producte IN NUMBER, p_quantitat IN NUMBER ) IS BEGIN INSERT INTO vendes (id_venda, id_producte, quantitat_venda, data_venda) VALUES (vendes_seq.NEXTVAL, p_id_producte, p_quantitat, SYSDATE); actualitzar_inventari(p_id_producte, -p_quantitat); END; / -- Procediment per registrar una devolució CREATE OR REPLACE PROCEDURE registrar_devolucio ( p_id_producte IN NUMBER, p_quantitat IN NUMBER ) IS BEGIN INSERT INTO devolucions (id_devolucio, id_producte, quantitat_devolucio, data_devolucio) VALUES (devolucions_seq.NEXTVAL, p_id_producte, p_quantitat, SYSDATE); actualitzar_inventari(p_id_producte, p_quantitat); END; / -- Generació d'informes d'inventari CREATE OR REPLACE PROCEDURE generar_informe_inventari IS CURSOR c_productes IS SELECT id_producte, nom_producte, quantitat_en_estoc FROM productes; BEGIN FOR r_producte IN c_productes LOOP DBMS_OUTPUT.PUT_LINE('ID Producte: ' || r_producte.id_producte); DBMS_OUTPUT.PUT_LINE('Nom Producte: ' || r_producte.nom_producte); DBMS_OUTPUT.PUT_LINE('Quantitat en Estoc: ' || r_producte.quantitat_en_estoc); DBMS_OUTPUT.PUT_LINE('-----------------------------'); END LOOP; END; /
Estudi de cas 2: Gestió de reserves d'hotel
Descripció del problema
Un hotel necessita un sistema per gestionar les reserves de les habitacions. El sistema ha de permetre:
- Registrar noves reserves.
- Cancel·lar reserves.
- Generar informes de reserves.
Solució amb PL/SQL
Estructura de la base de dades
CREATE TABLE habitacions ( id_habitacio NUMBER PRIMARY KEY, tipus_habitacio VARCHAR2(50), preu_per_nit NUMBER ); CREATE TABLE reserves ( id_reserva NUMBER PRIMARY KEY, id_habitacio NUMBER, data_inici DATE, data_fi DATE, client_nom VARCHAR2(100), client_email VARCHAR2(100), FOREIGN KEY (id_habitacio) REFERENCES habitacions(id_habitacio) );
Procediment per registrar una reserva
CREATE OR REPLACE PROCEDURE registrar_reserva ( p_id_habitacio IN NUMBER, p_data_inici IN DATE, p_data_fi IN DATE, p_client_nom IN VARCHAR2, p_client_email IN VARCHAR2 ) IS BEGIN INSERT INTO reserves (id_reserva, id_habitacio, data_inici, data_fi, client_nom, client_email) VALUES (reserves_seq.NEXTVAL, p_id_habitacio, p_data_inici, p_data_fi, p_client_nom, p_client_email); END; /
Procediment per cancel·lar una reserva
CREATE OR REPLACE PROCEDURE cancel·lar_reserva ( p_id_reserva IN NUMBER ) IS BEGIN DELETE FROM reserves WHERE id_reserva = p_id_reserva; END; /
Generació d'informes de reserves
CREATE OR REPLACE PROCEDURE generar_informe_reserves IS CURSOR c_reserves IS SELECT id_reserva, id_habitacio, data_inici, data_fi, client_nom, client_email FROM reserves; BEGIN FOR r_reserva IN c_reserves LOOP DBMS_OUTPUT.PUT_LINE('ID Reserva: ' || r_reserva.id_reserva); DBMS_OUTPUT.PUT_LINE('ID Habitació: ' || r_reserva.id_habitacio); DBMS_OUTPUT.PUT_LINE('Data Inici: ' || r_reserva.data_inici); DBMS_OUTPUT.PUT_LINE('Data Fi: ' || r_reserva.data_fi); DBMS_OUTPUT.PUT_LINE('Client Nom: ' || r_reserva.client_nom); DBMS_OUTPUT.PUT_LINE('Client Email: ' || r_reserva.client_email); DBMS_OUTPUT.PUT_LINE('-----------------------------'); END LOOP; END; /
Exercici pràctic
- Crea les taules
habitacions
ireserves
a la teva base de dades. - Implementa els procediments
registrar_reserva
icancel·lar_reserva
. - Insereix algunes habitacions a la taula
habitacions
. - Registra algunes reserves.
- Executa el procediment
generar_informe_reserves
per veure l'estat actual de les reserves.
Solució
-- Creació de les taules CREATE TABLE habitacions ( id_habitacio NUMBER PRIMARY KEY, tipus_habitacio VARCHAR2(50), preu_per_nit NUMBER ); CREATE TABLE reserves ( id_reserva NUMBER PRIMARY KEY, id_habitacio NUMBER, data_inici DATE, data_fi DATE, client_nom VARCHAR2(100), client_email VARCHAR2(100), FOREIGN KEY (id_habitacio) REFERENCES habitacions(id_habitacio) ); -- Procediment per registrar una reserva CREATE OR REPLACE PROCEDURE registrar_reserva ( p_id_habitacio IN NUMBER, p_data_inici IN DATE, p_data_fi IN DATE, p_client_nom IN VARCHAR2, p_client_email IN VARCHAR2 ) IS BEGIN INSERT INTO reserves (id_reserva, id_habitacio, data_inici, data_fi, client_nom, client_email) VALUES (reserves_seq.NEXTVAL, p_id_habitacio, p_data_inici, p_data_fi, p_client_nom, p_client_email); END; / -- Procediment per cancel·lar una reserva CREATE OR REPLACE PROCEDURE cancel·lar_reserva ( p_id_reserva IN NUMBER ) IS BEGIN DELETE FROM reserves WHERE id_reserva = p_id_reserva; END; / -- Generació d'informes de reserves CREATE OR REPLACE PROCEDURE generar_informe_reserves IS CURSOR c_reserves IS SELECT id_reserva, id_habitacio, data_inici, data_fi, client_nom, client_email FROM reserves; BEGIN FOR r_reserva IN c_reserves LOOP DBMS_OUTPUT.PUT_LINE('ID Reserva: ' || r_reserva.id_reserva); DBMS_OUTPUT.PUT_LINE('ID Habitació: ' || r_reserva.id_habitacio); DBMS_OUTPUT.PUT_LINE('Data Inici: ' || r_reserva.data_inici); DBMS_OUTPUT.PUT_LINE('Data Fi: ' || r_reserva.data_fi); DBMS_OUTPUT.PUT_LINE('Client Nom: ' || r_reserva.client_nom); DBMS_OUTPUT.PUT_LINE('Client Email: ' || r_reserva.client_email); DBMS_OUTPUT.PUT_LINE('-----------------------------'); END LOOP; END; /
Conclusió
Els estudis de cas presentats mostren com PL/SQL pot ser utilitzat per resoldre problemes reals en diferents contextos. A través de la creació de procediments, funcions i la gestió de dades, PL/SQL proporciona una eina poderosa per desenvolupar aplicacions robustes i eficients. Practicar amb aquests exemples t'ajudarà a consolidar els teus coneixements i a preparar-te per afrontar reptes similars en el teu entorn laboral.
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