Discusión:Prácticas ABD 2016

De FdIwiki ABD
Revisión a fecha de 20:16 15 mar 2016; ABD0419 (Discusión | contribuciones)

(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
Saltar a: navegación, buscar

--ABD0419 (discusión) 19:23 15 mar 2016 (CET) (Carlos Martínez Pérez y Carlos Martínez Gutiérrez)


create or replace PROCEDURE PEDIDOS_CLIENTE (

       dni_a_buscar clientes.dni%type
       ) as
       -- variables propias
       CURSOR cursor_cliente IS --cursor para encontrar el cliente
           select *
           from clientes
           where clientes.dni = dni_a_buscar;
       cl cursor_cliente%rowtype; 
       
       CURSOR cursor_pedido IS --cursor para encontrar sus pedidos
           select *
           from pedidos
           where pedidos.cliente = dni_a_buscar
           order by pedidos.fecha_hora_pedido; --ordenados por fecha
       pe cursor_pedido%rowtype;
       suma_importe pedidos.importe_total%type; --suma de sus pedidos
       -- excepciones de usuario
       no_pedidos EXCEPTION;
       no_cliente EXCEPTION;

BEGIN

 OPEN cursor_cliente;
 
   FETCH cursor_cliente INTO cl;
   IF cursor_cliente%notfound then  --si no se ha encontrado 
     raise no_cliente; --lanzamos excepción
   END IF;
   LOOP --escribimos sus datos y volvemos a buscar
     dbms_output.put_line('Nombre: ' || cl.nombre);
     dbms_output.put_line('Apellidos: ' || cl.apellido);
     dbms_output.put_line('Telefono: ' || cl.telefono);
     FETCH cursor_cliente INTO cl;
     EXIT when cursor_cliente%notfound;--si ya no hay más que buscar salimos
   END LOOP;


 CLOSE cursor_cliente;
 
 OPEN cursor_pedido;
   FETCH cursor_pedido INTO pe;
   IF cursor_pedido%notfound then --si no tiene pedidos
     raise no_pedidos; --lanzamos excepción
   END IF;
   LOOP --escribimos los datos del pedido y volvemos a buscar
     dbms_output.put_line('  Codigo: ' || pe.codigo);
     dbms_output.put_line('  Fecha: ' || pe.fecha_hora_pedido);
     dbms_output.put_line('  Fecha entrega: ' || pe.fecha_hora_entrega);
     dbms_output.put_line('  Estado: ' || pe.estado);
     dbms_output.put_line('  Importe: ' || pe.importe_total);
     dbms_output.put_line('  -----  ');
     FETCH cursor_pedido INTO pe;
     EXIT when cursor_pedido%notfound;
   END LOOP;
 CLOSE cursor_pedido;
 OPEN cursor_pedido; --calculamos la suma del importe de sus pedidos
 suma_importe := 0;
 LOOP
   FETCH cursor_pedido INTO pe;
   EXIT when cursor_pedido%notfound;
   suma_importe := suma_importe + pe.importe_total;
 END LOOP;
 CLOSE cursor_pedido;
 IF suma_importe != 0 then --si ha habido pedidos y hay un precio real
   dbms_output.put_line('Suma de sus pedidos: ' || suma_importe);
 END IF;
 
 --CONTROL DE EXCEPCIONES
 EXCEPTION
   when no_cliente then
     DBMS_output.put_line('cliente no encontrado');
   when no_pedidos then
     DBMS_output.put_line('el cliente no ha hecho pedidos');
   when others then
     DBMS_output.put_line('excepcion desconocida');
   

END;