Advertisement
Guest User

Untitled

a guest
Sep 17th, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 14.69 KB | None | 0 0
  1. CREATE OR REPLACE
  2. PACKAGE BODY PACKVIDEO AS
  3.   CURSOR cursorPelicula (idPelicula title.title_id%TYPE) IS
  4.       SELECT * FROM title WHERE title_id = idPelicula;
  5.   CURSOR cursorSocios IS SELECT *
  6.                   FROM member;
  7.  
  8.   --devuelve TRUE si el socio no adeuda peliculas, caso contrario FALSE
  9.   FUNCTION comprobarEstadoSocio(idSocio member.member_id%TYPE) RETURN BOOLEAN AS
  10.   BEGIN
  11.     FOR i IN 1..tablaAlquileres.COUNT LOOP
  12.       IF tablaAlquileres(i).member_id = idSocio AND tablaAlquileres(i).act_ret_date = NULL THEN
  13.         RETURN FALSE;
  14.       END IF;
  15.     END LOOP;
  16.     RETURN TRUE;
  17.   END comprobarEstadoSocio;  
  18.  
  19.   FUNCTION buscarPeliculaPorTitulo(tituloPelicula title.title%TYPE)RETURN NUMBER AS
  20.   idPelicula title.title_id%TYPE;
  21.   BEGIN
  22.     SELECT title_id INTO idPelicula FROM title WHERE title = tituloPelicula;
  23.     RETURN idPelicula;
  24.     EXCEPTION
  25.       WHEN NO_DATA_FOUND  OR TOO_MANY_ROWS THEN
  26.         RETURN -1;
  27.   END buscarPeliculaPorTitulo;
  28.  
  29.   FUNCTION comprobarDisponibilidad(idPelicula title_copy.title_id%TYPE) RETURN NUMBER AS
  30.   TYPE tipoTablaTitleCopy IS TABLE OF title_copy.copy_id%TYPE INDEX BY BINARY_INTEGER;
  31.   copiasDeLaPelicula tipoTablaTitleCopy;
  32.   BEGIN
  33.     SELECT copy_id BULK COLLECT INTO copiasDeLaPelicula FROM title_copy WHERE title_id = idPelicula AND status = 'AVAILABLE';
  34.     IF copiasDeLaPelicula.COUNT = 0 THEN
  35.       RETURN -1;
  36.     ELSE
  37.       RETURN copiasDeLaPelicula(copiasDeLaPelicula.FIRST);
  38.     END IF;
  39.     EXCEPTION
  40.       WHEN NO_DATA_FOUND THEN
  41.         RETURN -1;
  42.   END comprobarDisponibilidad;
  43.  
  44.   FUNCTION validarFechaReserva(fechaReserva reservation.res_date%TYPE) RETURN BOOLEAN AS
  45.   BEGIN
  46.     IF fechaReserva > SYSDATE+4 OR fechaReserva < SYSDATE THEN
  47.       RETURN FALSE;  
  48.     ELSE
  49.       RETURN TRUE;
  50.     END IF;
  51.   END validarFechaReserva;
  52.   FUNCTION comprobarReserva(idPelicula title.title_id%TYPE) RETURN BOOLEAN AS
  53.   fecha reservation.res_date%TYPE;
  54.   BEGIN
  55.     SELECT res_date INTO fecha FROM RESERVATION WHERE title_id = idPelicula;
  56.   RETURN TRUE;
  57.   EXCEPTION
  58.     WHEN NO_DATA_FOUND THEN
  59.       RETURN FALSE;
  60.     WHEN TOO_MANY_ROWS THEN
  61.       RETURN TRUE;
  62.   END comprobarReserva;
  63.  
  64.   FUNCTION comprobarReserva(idPelicula title.title_id%TYPE, idSocio member.member_id%TYPE) RETURN BOOLEAN AS
  65.   fecha reservation.res_date%TYPE;
  66.   BEGIN
  67.     SELECT res_date INTO fecha FROM RESERVATION WHERE member_id = idSocio AND title_id = idPelicula;
  68.   RETURN TRUE;
  69.   EXCEPTION
  70.     WHEN NO_DATA_FOUND THEN
  71.       RETURN FALSE;
  72.     WHEN TOO_MANY_ROWS THEN
  73.       RETURN TRUE;
  74.   END comprobarReserva;
  75.  
  76.   FUNCTION buscarSocioPorNombre(nombre member.first_name%TYPE, apellido member.last_name%TYPE) RETURN member.member_id%TYPE AS
  77.   i BINARY_INTEGER;
  78.   BEGIN
  79.     i := tablaSocios.FIRST;
  80.     WHILE i <= tablaSocios.LAST AND (nombre <> tablaSocios(i).first_name OR apellido <> tablaSocios(i).last_name) LOOP      
  81.         i := tablaSocios.next(i);
  82.     END LOOP;
  83.     IF i IS NULL THEN
  84.       RETURN -1;
  85.     ELSE
  86.       RETURN tablaSocios(i).member_id;
  87.     END IF;
  88.   END buscarSocioPorNombre;
  89.  
  90.   FUNCTION nuevoSocio(nombre member.first_name%TYPE, apellido member.last_name%TYPE, domicilio member.address%TYPE, localidad member.city%TYPE) RETURN member.member_id%TYPE AS
  91.     idNuevoSocio member.member_id%TYPE;
  92.   BEGIN
  93.     SELECT member_id_seq.NEXTVAL INTO idNuevoSocio FROM DUAL;
  94.     INSERT INTO MEMBER (member_id, last_name, first_name, address, city, join_date) VALUES (idNuevoSocio, apellido, nombre, domicilio, localidad, SYSDATE);
  95.     tablaSocios(idNuevoSocio).member_id := idNuevoSocio;
  96.     tablaSocios(idNuevoSocio).first_name := nombre;
  97.     tablaSocios(idNuevoSocio).last_name := apellido;
  98.     tablaSocios(idNuevoSocio).address := domicilio;
  99.     tablaSocios(idNuevoSocio).city := localidad;    
  100.     --TODO: ver tema exceptions
  101.     RETURN idNuevoSocio;
  102.   END nuevoSocio;
  103.  
  104.   FUNCTION nuevoSocio(nombre member.first_name%TYPE, apellido member.last_name%TYPE, domicilio member.address%TYPE, localidad member.city%TYPE, telefono member.phone%TYPE) RETURN member.member_id%TYPE AS
  105.     idNuevoSocio member.member_id%TYPE;
  106.   BEGIN
  107.     SELECT member_id_seq.NEXTVAL INTO idNuevoSocio FROM DUAL;
  108.     INSERT INTO MEMBER VALUES (idNuevoSocio, apellido, nombre, domicilio, localidad, telefono, SYSDATE);
  109.     IF sql%rowcount = 0 THEN
  110.       DBMS_OUTPUT.put_line('error');
  111.     END IF;
  112.     tablaSocios(idNuevoSocio).member_id := idNuevoSocio;
  113.     tablaSocios(idNuevoSocio).first_name := nombre;
  114.     tablaSocios(idNuevoSocio).last_name := apellido;
  115.     tablaSocios(idNuevoSocio).address := domicilio;
  116.     tablaSocios(idNuevoSocio).city := localidad;
  117.     tablaSocios(idNuevoSocio).phone := telefono;
  118.     RETURN idNuevoSocio;
  119.     --TODO: ver tema exceptions
  120.   END nuevoSocio;
  121.  
  122.   PROCEDURE reservarPelicula(idSocio member.member_id%TYPE, idPelicula title.title_id%TYPE, fechaReserva reservation.res_date%TYPE) AS
  123.   BEGIN
  124.     IF validarFechaReserva(fechaReserva) = TRUE THEN
  125.       INSERT INTO reservation VALUES (fechaReserva, idSocio, idPelicula);
  126.     ELSE
  127.       DBMS_OUTPUT.put_line('La fecha de reserva tiene que ser entre los 4 días posteriores'); --TODO: ver tema errores
  128.     END IF;
  129.     EXCEPTION
  130.       WHEN DUP_VAL_ON_INDEX THEN
  131.         DBMS_OUTPUT.put_line('El socio ya tenía reservada la pelicula');
  132.   END reservarPelicula;
  133.  
  134.   PROCEDURE reservarPelicula(nombre member.first_name%TYPE, apellido member.last_name%TYPE, idPelicula title.title_id%TYPE, fechaReserva reservation.res_date%TYPE) AS
  135.   idSocio member.member_id%TYPE;
  136.   exceptionSocioNoExistente EXCEPTION;
  137.   BEGIN
  138.     idSocio := buscarSocioPorNombre(nombre, apellido);
  139.     IF idSocio = -1 THEN
  140.       RAISE exceptionSocioNoExistente;
  141.     END IF;
  142.     reservarPelicula(idSocio, idPelicula, fechaReserva);
  143.     EXCEPTION
  144.       WHEN exceptionSocioNoExistente THEN
  145.         DBMS_OUTPUT.put_line('Socio no encontrado');      
  146.   END reservarPelicula;
  147.  
  148.   PROCEDURE alquilarPelicula(idSocio member.member_id%TYPE, idPelicula title.title_id%TYPE) AS
  149.   idCopia title_copy.copy_id%TYPE;
  150.   fechaActual DATE;
  151.   nuevoAlquiler NUMBER := tablaAlquileres.LAST+1;
  152.   exceptionCopiaNoExistente EXCEPTION;
  153.   exceptionSocioDeudor EXCEPTION;
  154.   BEGIN
  155.     IF comprobarEstadoSocio(idSocio) = FALSE THEN
  156.       RAISE exceptionSocioDeudor;
  157.     ELSE
  158.       --Si tiene una reserva de la pelicula la elimino
  159.       IF comprobarReserva(idPelicula, idSocio) = TRUE THEN
  160.         DELETE FROM reservation WHERE member_id = idSocio AND title_id = idPelicula;
  161.       END IF;
  162.       idCopia := comprobarDisponibilidad(idPelicula);
  163.       IF idCopia = -1 THEN
  164.         RAISE exceptionCopiaNoExistente;
  165.       ELSE
  166.         SELECT SYSDATE INTO fechaActual FROM DUAL;
  167.         tablaAlquileres(nuevoAlquiler).book_date := fechaActual;
  168.         tablaAlquileres(nuevoAlquiler).copy_id := idCopia;
  169.         tablaAlquileres(nuevoAlquiler).member_id := idSocio;
  170.         tablaAlquileres(nuevoAlquiler).title_id := idPelicula;
  171.         --tablaAlquileres(nuevoAlquiler).act_ret_date := NULL;
  172.         tablaAlquileres(nuevoAlquiler).exp_ret_date := fechaActual+2;
  173.         INSERT INTO rental (book_date, copy_id, member_id, title_id, exp_ret_date) VALUES (fechaActual, idCopia, idSocio, idPelicula, fechaActual+2);
  174.         UPDATE title_copy SET status = 'RENTED' WHERE copy_id = idCopia AND title_id = idPelicula;
  175.         --TODO:Ver el tema de los errores
  176.         DBMS_OUTPUT.put_line('El numero de copia de la pelicula ' || idPelicula || ' que se alquilo es: ' || idCopia);
  177.       END IF;
  178.     END IF;
  179.     EXCEPTION
  180.       WHEN exceptionCopiaNoExistente THEN
  181.           DBMS_OUTPUT.put_line('Pelicula no disponible');
  182.       WHEN exceptionSocioDeudor THEN
  183.           DBMS_OUTPUT.put_line('El socio es deudor.');
  184.   END alquilarPelicula;
  185.  
  186.   PROCEDURE alquilarPelicula(idSocio member.member_id%TYPE, tituloPelicula title.title%TYPE) AS
  187.   idPelicula NUMBER;
  188.   BEGIN
  189.     idPelicula := buscarPeliculaPorTitulo(tituloPelicula);
  190.     IF idPelicula = -1 THEN
  191.       DBMS_OUTPUT.put_line('No existe la pelicula o hay mas de una con ese nombre'); --TODO: ver tema errores
  192.     ELSE
  193.       alquilarPelicula(idSocio, idPelicula);
  194.     END IF;
  195.   END alquilarPelicula;
  196.  
  197.   PROCEDURE retornarPelicula(idCopia title_copy.copy_id%TYPE, idPelicula title_copy.title_id%TYPE) AS
  198.   estadoCopia title_copy.status%TYPE;
  199.   exceptionUpdateAlquiler EXCEPTION;
  200.   exceptionUpdateCopia EXCEPTION;
  201.   BEGIN
  202.     IF comprobarReserva(idPelicula) = TRUE THEN
  203.       estadoCopia := 'RESERVED';
  204.     ELSE
  205.       estadoCopia := 'AVAILABLE';
  206.     END IF;
  207.     UPDATE RENTAL SET act_ret_date = SYSDATE WHERE copy_id = idCopia AND title_id = idPelicula;
  208.     IF sql%rowcount = 0 THEN
  209.       RAISE exceptionUpdateAlquiler;
  210.     END IF;
  211.     UPDATE title_copy SET status = estadoCopia WHERE copy_id = idCopia AND title_id = idPelicula;
  212.     IF sql%rowcount = 0 THEN
  213.       RAISE exceptionUpdateCopia;
  214.     END IF;
  215.     EXCEPTION
  216.       WHEN NO_DATA_FOUND THEN
  217.         DBMS_OUTPUT.put_line('Numero de copia inexistente'); --TODO: ver tema errores
  218.       WHEN exceptionUpdateAlquiler THEN
  219.         DBMS_OUTPUT.put_line('Error al actualizar alquiler'); --TODO: ver tema errores
  220.       WHEN exceptionUpdateCopia THEN
  221.         DBMS_OUTPUT.put_line('Error al actualizar estado de la copia'); --TODO: ver tema errores
  222.   END retornarPelicula;
  223.  
  224.   PROCEDURE listarSocio(idSocio member.member_id%TYPE) AS
  225.   tituloPelicula title.title%TYPE;
  226.   cantidadPeliculasNoDevueltas NUMBER := 0;
  227.   BEGIN
  228.       DBMS_OUTPUT.put_line('Nombre: ' || tablaSocios(idSocio).first_name || '. Apellido: ' || tablaSocios(idSocio).last_name);
  229.       DBMS_OUTPUT.put_line('Dirección: ' || tablaSocios(idSocio).address || '. Ciudad: ' || tablaSocios(idSocio).city || '.');
  230.       IF comprobarEstadoSocio(tablaSocios(idSocio).member_id) = TRUE THEN
  231.         DBMS_OUTPUT.put_line('Normal');
  232.       ELSE
  233.         DBMS_OUTPUT.put_line('Deudor');  
  234.       END IF;
  235.       FOR j IN 1..tablaAlquileres.COUNT LOOP
  236.         IF tablaAlquileres(j).member_id = tablaSocios(idSocio).member_id THEN
  237.           DBMS_OUTPUT.put_line('Fecha de alquiler: ' || tablaAlquileres(j).book_date || '. Fecha de devolución: ' || tablaAlquileres(j).act_ret_date);
  238.           SELECT title INTO tituloPelicula FROM title WHERE title_id = tablaAlquileres(j).title_id;
  239.           DBMS_OUTPUT.put_line('Titulo: ' || tituloPelicula);
  240.           IF tablaAlquileres(j).act_ret_date = NULL THEN
  241.             cantidadPeliculasNoDevueltas := cantidadPeliculasNoDevueltas+1;
  242.           END IF;
  243.         END IF;
  244.       END LOOP;
  245.       DBMS_OUTPUT.put_line('Este socio debe ' || cantidadPeliculasNoDevueltas || ' peliculas.');
  246.   END listarSocio;
  247.  
  248.   PROCEDURE listarSocio(nombre member.first_name%TYPE, apellido member.last_name%TYPE) AS
  249.   idSocio member.member_id%TYPE;
  250.   BEGIN
  251.     idSocio := buscarSocioPorNombre(nombre, apellido);
  252.     listarSocio(idSocio);
  253.   END listarSocio;
  254.  
  255.   PROCEDURE listarPeliculasAlquiladas AS
  256.     cantidadCopias NUMBER;
  257.   BEGIN
  258.       FOR i IN 1..tablaAlquileres.COUNT LOOP
  259.           FOR unaPeli IN cursorPelicula(tablaAlquileres(i).title_id) LOOP
  260.             DBMS_OUTPUT.put_line('id: ' || unaPeli.title_id || '. Nombre: ' || unaPeli.title || '. Fecha de Estreno: ' || unaPeli.release_date);
  261.             DBMS_OUTPUT.put_line(unaPeli.description);
  262.             DBMS_OUTPUT.put_line('Rating: ' || unaPeli.rating || '. Categoria: ' || unaPeli.category);
  263.             SELECT COUNT(*) INTO cantidadCopias FROM title_copy WHERE title_id = unaPeli.title_id AND status = 'AVAILABLE';
  264.             DBMS_OUTPUT.put_line('Cantidad de copias disponibles: ' || cantidadCopias);
  265.           END LOOP;
  266.       END LOOP;
  267.   END;
  268. BEGIN
  269.   FOR registroSocio IN cursorSocios LOOP
  270.     tablaSocios(registroSocio.member_id).member_id := registroSocio.member_id;
  271.     tablaSocios(registroSocio.member_id).last_name := registroSocio.last_name;
  272.     tablaSocios(registroSocio.member_id).first_name := registroSocio.first_name;
  273.     tablaSocios(registroSocio.member_id).address := registroSocio.address;
  274.     tablaSocios(registroSocio.member_id).city := registroSocio.city;
  275.     tablaSocios(registroSocio.member_id).phone := registroSocio.phone;
  276.     tablaSocios(registroSocio.member_id).join_date := registroSocio.join_date;
  277.   END LOOP;
  278.   SELECT * BULK COLLECT INTO tablaAlquileres FROM RENTAL;
  279. END PACKVIDEO;
  280.  
  281. --Especificacion
  282.  
  283. CREATE OR REPLACE
  284. PACKAGE PACKVIDEO
  285. IS
  286.     TYPE tipoTablaSocios IS TABLE OF member%ROWTYPE INDEX BY BINARY_INTEGER;
  287.     tablaSocios tipoTablaSocios;
  288.     TYPE tipoTablaAlquileres IS TABLE OF rental%ROWTYPE INDEX BY BINARY_INTEGER;
  289.     tablaAlquileres tipoTablaAlquileres;
  290.     FUNCTION nuevoSocio(nombre member.first_name%TYPE, apellido member.last_name%TYPE, domicilio member.address%TYPE, localidad member.city%TYPE) RETURN member.member_id%TYPE;
  291.     FUNCTION nuevoSocio(nombre member.first_name%TYPE, apellido member.last_name%TYPE, domicilio member.address%TYPE, localidad member.city%TYPE, telefono member.phone%TYPE) RETURN member.member_id%TYPE;
  292.     PROCEDURE reservarPelicula(idSocio member.member_id%TYPE, idPelicula title.title_id%TYPE, fechaReserva reservation.res_date%TYPE);
  293.     PROCEDURE reservarPelicula(nombre member.first_name%TYPE, apellido member.last_name%TYPE, idPelicula title.title_id%TYPE, fechaReserva reservation.res_date%TYPE);
  294.     PROCEDURE alquilarPelicula(idSocio member.member_id%TYPE, idPelicula title.title_id%TYPE);
  295.     PROCEDURE alquilarPelicula(idSocio member.member_id%TYPE, tituloPelicula title.title%TYPE);
  296.     PROCEDURE retornarPelicula(idCopia title_copy.copy_id%TYPE, idPelicula title_copy.title_id%TYPE);
  297.     PROCEDURE listarSocio(nombre member.first_name%TYPE, apellido member.last_name%TYPE);
  298.     PROCEDURE listarSocio(idSocio member.member_id%TYPE);
  299.     PROCEDURE listarPeliculasAlquiladas;
  300. END;
  301.  
  302. --Trigger
  303.  
  304. CREATE OR REPLACE TRIGGER ACTUALIZARRESERVAS
  305. BEFORE INSERT OR UPDATE ON RESERVATION
  306. FOR EACH ROW
  307. BEGIN
  308.   DELETE FROM RESERVATION WHERE RES_DATE < SYSDATE;
  309. END;
  310.  
  311. --setDePruebas
  312.  
  313. DECLARE
  314. idSocio NUMBER;
  315. BEGIN
  316.   idSocio := packvideo.nuevoSocio('andres', 'cabrera', 'casa rosada', 'asdasd');
  317. END;
  318.  
  319. BEGIN
  320.   packvideo.reservarPelicula('andres', 'cabrera', 92, '12/06/2011');
  321. END;
  322.  
  323. BEGIN
  324.   packvideo.alquilarpelicula(133, 'Soda Gang');
  325.   DBMS_OUTPUT.put_line (packvideo.tablaAlquileres(packvideo.tablaAlquileres.LAST).member_id);
  326. END;
  327.  
  328. BEGIN
  329.   packvideo.alquilarpelicula(133, 'zona ganjah');
  330.   --dbms_output.put_line (packvideo.tablaAlquileres(packvideo.tablaAlquileres.last).member_id);
  331. END;
  332.  
  333. BEGIN
  334.   --Alquilar una pelicula
  335.   --packvideo.alquilarpelicula(133, 97);
  336.   --Devolver una pelicula
  337.   --ackvideo.retornarpelicula(1, 97);
  338.   --Reservar una pelicula
  339.   packvideo.reservarpelicula(132, 97, '15/06/2011');
  340.   --Mostrar el listado de peliculas alquiladas
  341.   --packvideo.listarpeliculasalquiladas;
  342.   --packvideo.listarSocio('andres', 'cabrera');
  343. END;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement