miércoles, 8 de diciembre de 2010

PL/SQL

Ejercicios en PL/SQL

1. Mostrar para cada uno de los instructores su identificación, nombre completo, y sueldo a pagar en un mes X de un año Z si se sabe que corresponde al producto de la cantidad de lecciones dictadas en el mes por 0.05% del valor total de de los pagos realizados en el mes.

DECLARE

v_mes VARCHAR(2);
v_año VARCHAR(4);

CUROR c_pago IS
SELECT identificacion,nombre,apellido,COUNT(fecha) lecciones
FROM INSTRUCTORES,LECCIONES
WHERE TO_CHAR(fecha,'mm')=v_mes
AND identificacion=id_instructor
AND TO_CHAR(fecha,'yyyy')=v_año;

BEGIN

v_mes:='&mes';
v_año:='&año';

SELECT (SUM(valor) *0.05) parcial
FROM PAGOS
WHERE TO_CHAR(fecha,'mm')=v_mes
AND TO_CHAR(fecha,'yyyy')=v_año;

DBMS_OUTPUT.PUT_LINE('Pagos a instructores');
FOR r_pago IN c_pago LOOP
DBMS_OUTPUT.PUT_LINE('Identificacion: '||r_pago.identificacion||'Nombre:'||r_ipago.nombre||'
'||r_pago.apellido||' El sueldo es: '||parcial*r_pago.lecciones);
END LOOP;
END;
/

-----------------------------------------------------------------------------------------------------------------------------------

2. Capturar la identificación de un cliente y mostrar un informe que conste de las siguientes partes: una primera parte sus datos básicos (nombre completo, dirección de residencia y valor total de los pagos realizados en el año 2009), una segunda parte el detalle de sus pagos realizados en el año 2009 (fecha y valor).

DECLARE

v_id_cliente CLIENTES.identificacion%TYPE;

CURSOR c_cliente IS
SELECT nombre,apellido,direccion_res,SUM(valor) valor
FROM CLIENTES,PAGOS
WHERE identificacion=id_cliente
AND identificacion=v_id_cliente
AND TO_CHAR(fecha,'yyyy')='2009';

CUROSR c_detalle IS
SELECT fecha,valor
FROM PAGOS
WHERE id_cliente=v_id_cliente
AND TO_CHAR(fecha,'yyyy')='2009';

BEGIN

v_id_cliente:='&ident';

FOR r_cliente IN c_cliente LOOP
DBMS_OUTPUT.PUT_LINE('Nombre: '||r_cliente.nombre||' '||r_cliente.apellido||
'direccion: '||r_cliente.direccion_res||'total'||r_cliente.valor);
FOR r_pago IN c_detalle LOOP
DBMS_OUTPUT.PUT_LINE('Fecha: 'r_pago.fecha||' valor'||r_pago.valor);
END LOOP;
END LOOP;
END;
/


----------------------------------------------------------------------------------------------------------------------------------

3. Escribir una función que reciba la identificación de un cliente y un año X y devuelva el valor total de los pagos realizados en el año X.

CREATE OR REPLACE FUNCTION f_pago (ide_clien CLIENTES.identificacion%TYPE,
v_año VARCHAR2) RETURN NUMBER IS

v_valor PAGOS.valor%TYPE;

BEGIN

SELECT SUM(valor) valor
INTO v_valor
FROM PAGOS
WHERE id_cliente=ide_clien
AND TO_CHAR(fecha,'YYYY')=v_año;

RETURN v_valor;

END f_cita;
/



----------------------------------------------------------------------------------------------------------------------------------

4. Escribir una función que reciba la identificación de un cliente y devuelve la información completa del cliente.

CREATE OR REPLACE FUNCTION f_cliente (ide_clien CLIENTES.identificacion%TYPE)
RETURN CLIENTES%ROWTYPE IS

v_info CLIENTES%ROWTYPE;

BEGIN

SELECT *
INTO v_info
FROM CLIENTES
WHERE identificacion=ide_clien

RETURN v_info;

END f_cliente;
/


----------------------------------------------------------------------------------------------------------------------------------

5. Escribir un procedimiento almacenado que reciba la identificación de un cliente y el valor de un año X, y muestre un informe que conste de las siguientes elementos: sus datos básicos (invocar la función del numeral 2), valor total de los pagos realizados en el año X. (invocar la función del numeral 1).

CREATE OR REPLACE PROCEDURE p_informe (ide_clien CLIENTES.identificacion%TYPE, v_año VARCHAR2) AS

v_cliente CLIENTES%ROWTYPE;
v_pago PAGOS.valor%TYPE;

BEGIN

v_cliente:=f_cliente(ide_cliente);

v_pago:=f_pago(ide_cliente,v_año);

IF v_pago > 100 THEN

DBMS_OUTPUT.PUT_LINE('nombre completo: '||v_cliente.nombre||' '||v_cliente.apellido||'direccion residencia: '||
v_cliente.direccion_res||' telefono res: '||v_cliente.telefono_res||' direcion oficina: '|| v_cliente.direccion_of||' telefono of: '||v_cliente.telefono_of||' celular: '||
v_cliente.celular);

DBMS_OUTPUT.PUT_LINE('el valor total de los pagos es: '||v_pago);
ELSE
DBMS_OUTPUT.PUT_LINE('El valor no es el adecuado');
END IF;
END;
/



----------------------------------------------------------------------------------------------------------------------------------

No hay comentarios:

Publicar un comentario