PL/SQL Video Store Management System: Procedures and Functions
Classified in Computers
Written on in
English with a size of 5.11 KB
PL/SQL Video Store Management System
Sequence Creation
Create a sequence to automatically generate unique primary keys for members:
CREATE SEQUENCE SOCIO_PK_SEQ
INCREMENT BY 1
START WITH 01
MAXVALUE 1000
NOCYCLE;Member Management Procedures
Create a procedure to register new members and execute test inserts:
CREATE OR REPLACE PROCEDURE NUEVO_SOCIO(
P_APE1 SOCIOS.APE1%TYPE,
P_APE2 SOCIOS.APE2%TYPE,
P_DIREC SOCIOS.DIRECCION%TYPE,
P_CIUDAD SOCIOS.CIUDAD%TYPE,
P_TELEF SOCIOS.TELEFONO%TYPE
) IS
BEGIN
INSERT INTO SOCIOS
VALUES (SOCIO_PK_SEQ.NEXTVAL, P_APE1, P_APE2, P_DIREC, P_CIUDAD, P_TELEF, SYSDATE);
COMMIT;
END NUEVO_SOCIO;
/
BEGIN
NUEVO_SOCIO('ARMENTEROS', 'NAVO', 'POZOA S/N', 'VITORIA', 945112233);
END;
/
BEGIN
NUEVO_SOCIO('PEREZ', 'ALONSO', 'GORBEA 33', 'VITORIA', 945998877);
END;
/
BEGIN
NUEVO_SOCIO('PEREZ', 'BEITIA', 'DATO S/N', 'VITORIA', 945445566);
END;
/Movie and Copy Update Procedures
Create a procedure to update movie copy statuses and handle non-existent records:
CREATE OR REPLACE PROCEDURE ACTUALIZA_PELICULA(
P_IDPELI COPIA_PELICULA.ID_PELICULA%TYPE,
P_IDCOPIA COPIA_PELICULA.ID_COPIA%TYPE,
P_ESTADO COPIA_PELICULA.ESTADO%TYPE
) IS
BEGIN
UPDATE COPIA_PELICULA
SET ESTADO = UPPER(P_ESTADO)
WHERE ID_PELICULA = P_IDPELI AND ID_COPIA = P_IDCOPIA;
COMMIT;
IF SQL%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE('LA PELICULA O COPIA A ACTUALIZAR NO EXISTE');
ELSE
DBMS_OUTPUT.PUT_LINE('PELICULA ACTUALIZADA');
END IF;
/* SE PONE EL SQL NOTFOUND PORQUE EL UPDATE NO GENERA UN ERROR EN EXCEPTION */
END ACTUALIZA_PELICULA;
/Movie Reservation Procedure
Create a procedure to handle movie reservations when copies are unavailable:
CREATE OR REPLACE PROCEDURE RESERVA_PELICULA(
P_IDSOCIO RESERVAS.ID_SOCIO%TYPE,
P_IDPELI RESERVAS.ID_PELICULA%TYPE
) IS
BEGIN
INSERT INTO RESERVAS VALUES (P_IDSOCIO, P_IDPELI, SYSDATE);
COMMIT;
END RESERVA_PELICULA;
/Rental Management Functions
First Rental Function
Function to process a rental using the member ID and check for available copies:
CREATE OR REPLACE FUNCTION NUEVO_ALQUILER1(
P_IDPELI PELICULAS.ID_PELICULA%TYPE,
P_IDSOCIO SOCIOS.ID_SOCIO%TYPE
)
RETURN DATE
IS
CURSOR C_ALQUILER1 IS
SELECT *
FROM COPIA_PELICULA
WHERE ID_PELICULA = P_IDPELI;
VREG C_ALQUILER1%ROWTYPE;
V_FLAG BOOLEAN := FALSE;
BEGIN
OPEN C_ALQUILER1;
FETCH C_ALQUILER1 INTO VREG;
WHILE NOT V_FLAG AND C_ALQUILER1%FOUND LOOP
IF VREG.ESTADO = 'DISPONIBLE' THEN
ACTUALIZA_PELICULA(VREG.ID_PELICULA, VREG.ID_COPIA, 'ALQUILADA');
INSERT INTO ALQUILERES
VALUES (VREG.ID_PELICULA, VREG.ID_COPIA, P_IDSOCIO, SYSDATE, SYSDATE + 3);
V_FLAG := TRUE;
END IF;
FETCH C_ALQUILER1 INTO VREG;
END LOOP;
COMMIT;
CLOSE C_ALQUILER1;
IF V_FLAG THEN
RETURN (SYSDATE + 3);
ELSE
RESERVA_PELICULA(P_IDSOCIO, P_IDPELI);
RETURN NULL;
END IF;
END NUEVO_ALQUILER1;
/
DECLARE
vresul DATE;
BEGIN
vresul := nuevo_alquiler1(90, 1);
dbms_output.put_line('Fecha de devolución: ' || vresul);
END;
/Second Rental Function with Surname Lookup
Function to process a rental using the member's surname, including exception handling for duplicate surnames:
CREATE OR REPLACE FUNCTION NUEVO_ALQUILER2(
P_IDPELI PELICULAS.ID_PELICULA%TYPE,
P_APESOCIO SOCIOS.APE1%TYPE
)
RETURN DATE
IS
CURSOR C_ALQUILER1 IS
SELECT *
FROM COPIA_PELICULA
WHERE ID_PELICULA = P_IDPELI;
VREG C_ALQUILER1%ROWTYPE;
V_FLAG BOOLEAN := FALSE;
CURSOR C_ALQUILER2 IS
SELECT *
FROM SOCIOS
WHERE APE1 = P_APESOCIO;
V_APE1 SOCIOS.APE1%TYPE;
BEGIN
SELECT APE1 INTO V_APE1
FROM SOCIOS
WHERE APE1 = P_APESOCIO;
OPEN C_ALQUILER1;
FETCH C_ALQUILER1 INTO VREG;
WHILE NOT V_FLAG AND C_ALQUILER1%FOUND LOOP
IF VREG.ESTADO = 'DISPONIBLE' THEN
ACTUALIZA_PELICULA(VREG.ID_PELICULA, VREG.ID_COPIA, 'ALQUILADA');
-- Note: Ensure R_ALQUILER2 reference aligns with proper cursor loop context
INSERT INTO ALQUILERES
VALUES (VREG.ID_PELICULA, VREG.ID_COPIA, 0, SYSDATE, SYSDATE + 3);
V_FLAG := TRUE;
END IF;
FETCH C_ALQUILER1 INTO VREG;
END LOOP;
COMMIT;
CLOSE C_ALQUILER1;
IF V_FLAG THEN
RETURN (SYSDATE + 3);
ELSE
RESERVA_PELICULA(0, P_IDPELI);
RETURN NULL;
END IF;
EXCEPTION
WHEN TOO_MANY_ROWS THEN
FOR R_ALQUILER2 IN C_ALQUILER2 LOOP
DBMS_OUTPUT.PUT_LINE('CUIDADO! HAY MAS DE UN SOCIO CON EL MISMO APELLIDO');
DBMS_OUTPUT.PUT_LINE(R_ALQUILER2.ID_SOCIO || '-' || R_ALQUILER2.APE1 || ', ' || R_ALQUILER2.APE2);
END LOOP;
RETURN NULL;
END NUEVO_ALQUILER2;
/