Práctica 1 - revisa precio con comision.sql

De FdIwiki ABD
Saltar a: navegación, buscar

--Jcopado (discusión) 20:46 14 mar 2016 (CET) (Jesús Copado y Javier Vicente)

CREATE OR REPLACE PROCEDURE REVISA_PRECIO_CON_COMISION AS

 contieneSalida Contiene%rowtype;
 
 pre_plato platos.precio%TYPE;
 com_rest restaurantes.comision%TYPE;
 pre_con_comision contiene.precio_con_comision%TYPE;
 rest_contiene contiene.restaurante%TYPE;
 plato_contiene contiene.plato%TYPE;
 pedido_contiene contiene.pedido%TYPE;
 unidades_contiene contiene.unidades%TYPE;
 
 precio_debido contiene.precio_con_comision%TYPE;
 
 cursor cursorContiene IS
   SELECT platos.precio, restaurantes.comision, contiene.precio_con_comision,
   contiene.restaurante, contiene.plato, contiene.pedido, contiene.unidades
   FROM contiene
   INNER JOIN restaurantes ON contiene.restaurante = restaurantes.codigo
   INNER JOIN platos ON contiene.plato = platos.nombrePlato;
  
 resultado_funcion INT;
 
 num_filas_modificadas INT := 0;
 
 fallo_guardaPlato EXCEPTION;

BEGIN

 OPEN cursorContiene;
 LOOP
   FETCH cursorContiene INTO pre_plato, com_rest, pre_con_comision,
   rest_contiene, plato_contiene, pedido_contiene, unidades_contiene;
   EXIT WHEN cursorContiene%NOTFOUND;
   precio_debido := pre_plato + (pre_plato * (com_rest / 100));
   IF pre_con_comision IS NULL OR precio_debido <> pre_con_comision THEN
     num_filas_modificadas := num_filas_modificadas + 1;
     resultado_funcion := guardaPlato(rest_contiene, plato_contiene, pedido_contiene, precio_debido, unidades_contiene);
     
     IF resultado_funcion = 1 THEN
       RAISE fallo_guardaPlato;
     END IF;
     
   UPDATE contiene
   SET contiene.precio_con_comision = precio_debido
   WHERE contiene.restaurante = rest_contiene AND contiene.plato = plato_contiene AND contiene.pedido = pedido_contiene;
   END IF;
 END LOOP;
 CLOSE cursorContiene;

IF num_filas_modificadas = 0 THEN DBMS_OUTPUT.put_line('Ningún cambio en los datos de Contiene.');

 ELSE
   DBMS_OUTPUT.put_line('Número de filas modificadas en Contiene: ' || num_filas_modificadas);

END IF;

 EXCEPTION
   WHEN fallo_guardaPlato THEN
     DBMS_OUTPUT.put_line('Fallo en la función guardaPlato');
 

END REVISA_PRECIO_CON_COMISION;