Práctica 1 - pedido cliente.sql
De FdIwiki ABD
Revisión a fecha de 11:29 14 mar 2016; Jorge (Discusión | contribuciones)
pedido_cliente.sql
CREATE OR REPLACE PROCEDURE PEDIDOS_CLIENTE( dnibusca CLIENTES.DNI%TYPE) AS --Declaramos el cursor CURSOR cursorPedido IS SELECT * /*LEFT OUTER, para que coja todos los datos de clientes y los junte con los de pedidos (haya o no datos de estos últimos)*/ 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; --Declaramos la variable importeTotal importeTotal PEDIDOS.importe_total%type; --Declaramos las excepciones ClienteNoEncontrado EXCEPTION; ClienteSinPedidos EXCEPTION; BEGIN OPEN cursorPedido; --Hacemos un fetch para pedido 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; --Iniciamos el bucle, para la extraccion de datos LOOP --Si el cursor acaba, sale 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)); --Hacemos un fetch para pedido 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;