Práctica 1 - pedido cliente.sql

De FdIwiki ABD
Saltar a: navegación, buscar

pedido_cliente.sql

 CREATE OR REPLACE PROCEDURE PEDIDOS_CLIENTE(
 dnibusca CLIENTES.DNI%TYPE) AS
 
 --Declaramos el cursor
 CURSOR cursorPedido IS
   SELECT *
     FROM CLIENTES LEFT OUTER JOIN PEDIDOS
      ON CLIENTES.dni = PEDIDOS.cliente
     WHERE dnibusca = CLIENTES.dni
     ORDER BY PEDIDOS.fecha_hora_pedido ASC;
     
     --Declaramos la variable pedido de tipo cursor
     pedido cursorPedido%rowtype;
     importeTotal PEDIDOS.importe_total%type;
     
     --Declaramos las excepciones
     ClienteNoEncontrado EXCEPTION;
     ClienteSinPedidos EXCEPTION;
 BEGIN
   OPEN cursorPedido;
   
   FETCH cursorPedido INTO pedido;
   
   --Definimos la excepción si no encuentra al cliente
   IF cursorPedido%NOTFOUND THEN
     RAISE ClienteNoEncontrado;
   END IF;
   
   --Imprimimos los datos personales
   DBMS_output.put_line(
     chr(10) ||'DATOS PERSONALES' || chr(10) ||
     '--DNI: ' || pedido.dni || chr(10) ||
     '--Nombre: ' || pedido.nombre || chr(10) ||
     '--Apellido: ' || pedido.apellido || chr(10) ||
     '--Calle: ' || pedido.calle || chr(10) ||
     '--Número: ' || pedido.numero || chr(10) ||
     '--Localidad: ' || pedido.localidad || chr(10) ||
     '--Teléfono: ' || pedido.telefono || chr(10) ||
     chr(10) || 'LISTA DE PEDIDOS');
   
   --Definimos la excepcion si no hay pedidos
   IF pedido.codigo IS NULL THEN
     RAISE ClienteSinPedidos;
   END IF;
    
   LOOP
     EXIT WHEN cursorPedido%NOTFOUND;
     --Imprimimos todos los pedidos de un cliente
     DBMS_output.put_line(
       '--Código: ' || pedido.codigo || chr(10) ||
       '--Fecha de pedido: ' || pedido.fecha_hora_pedido || chr(10) ||
       '--Fecha de entrega: ' || pedido.fecha_hora_entrega || chr(10) ||
       '--Estado: ' || pedido.estado || chr(10) ||
       '--Importe: ' || pedido.importe_total || chr(10));
     
     FETCH cursorPedido INTO pedido;    
   END LOOP;
   
   --Cerramos el cursor
   IF cursorPedido%ISOPEN THEN
     CLOSE cursorPedido;
   END IF; 
   
   --Abrimos el cursor
   OPEN cursorPedido;
   importeTotal := 0;
   FETCH cursorPedido INTO pedido;
   LOOP
     EXIT WHEN cursorPedido%NOTFOUND;
     --Calculamos la suma de los importes de los pedidos
     importeTotal := importeTotal + pedido.importe_total;
     FETCH cursorPedido INTO pedido;
   END LOOP;
   
   --Mostramos el total
   DBMS_output.put_line(
     'IMPORTE TOTAL: ' || importeTotal || chr(10));
   
   --Cerramos el cursor
   IF cursorPedido%ISOPEN THEN
     CLOSE cursorPedido;
   END IF; 
   
 --Excepciones
 EXCEPTION 
   WHEN ClienteNoEncontrado THEN
     DBMS_output.put_line('El cliente '|| dnibusca || ' no existe.');
   WHEN ClienteSinPedidos THEN
     DBMS_output.put_line('El cliente '|| dnibusca || ' no tiene pedidos.');
   WHEN OTHERS THEN
     DBMS_output.put_line('Se ha producido un error inesperado. Código de la Excepción: '
     || SQLCODE || '. Descripción: ' || SUBSTR(SQLERRM,1, 100));     
 END PEDIDOS_CLIENTE;