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

  1. Crea les taules productes, vendes i devolucions a la teva base de dades.
  2. Implementa els procediments actualitzar_inventari, registrar_venda i registrar_devolucio.
  3. Insereix alguns productes a la taula productes.
  4. Registra algunes vendes i devolucions.
  5. 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

  1. Crea les taules habitacions i reserves a la teva base de dades.
  2. Implementa els procediments registrar_reserva i cancel·lar_reserva.
  3. Insereix algunes habitacions a la taula habitacions.
  4. Registra algunes reserves.
  5. 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.

© Copyright 2024. Tots els drets reservats