Sunteți pe pagina 1din 10

ENUNCIADO 1:

Realizar un procedimiento almacenado que usando 2 cursores


explícitos permita mostrar en pantalla los empleados que más
ganan de cada departamento y los que menos ganan.

SOLUCION SQL:
--SET SEVEROUTPUT ON

CREATE OR REPLACE

PROCEDURE P_DEP_SALARY_MAX_MIN(P_NOM_DEPART
VARCHAR2)IS

V_NOMBRE_DEP HR.DEPARTMENTS.DEPARTMENT_NAME%TYPE;

V_APELLIDO HR.EMPLOYEES.LAST_NAME%TYPE;

V_SALARIO HR.EMPLOYEES.SALARY%TYPE;

CURSOR C_MAXIMO IS

SELECT RESULT_MAXIMO.DEPARTAMENTO,

E.LAST_NAME APELLIDO,

RESULT_MAXIMO.SALARIO_MAX

FROM EMPLOYEES E,( SELECT DEP.DEPARTMENT_ID


COD_DEPART,

DEP.DEPARTMENT_NAME DEPARTAMENTO,

MAX(EMP.SALARY) SALARIO_MAX

FROM DEPARTMENTS DEP,

EMPLOYEES EMP

WHERE DEP.DEPARTMENT_ID = EMP.DEPARTMENT_ID

GROUP BY DEP.DEPARTMENT_ID,

DEP.DEPARTMENT_NAME

ORDER BY 1)RESULT_MAXIMO

WHERE E.DEPARTMENT_ID = RESULT_MAXIMO.COD_DEPART

AND E.SALARY = RESULT_MAXIMO.SALARIO_MAX


AND UPPER(RESULT_MAXIMO.DEPARTAMENTO) LIKE
UPPER(P_NOM_DEPART);

CURSOR C_MINIMO IS

SELECT RESULT_MINIMO.DEPARTAMENTO,

E.LAST_NAME APELLIDO,

RESULT_MINIMO.SALARIO_MIN

FROM EMPLOYEES E,( SELECT DEP.DEPARTMENT_ID


COD_DEPART,

DEP.DEPARTMENT_NAME DEPARTAMENTO,

MIN(EMP.SALARY) SALARIO_MIN

FROM DEPARTMENTS DEP,

EMPLOYEES EMP

WHERE DEP.DEPARTMENT_ID = EMP.DEPARTMENT_ID

GROUP BY DEP.DEPARTMENT_ID,

DEP.DEPARTMENT_NAME

ORDER BY 1)RESULT_MINIMO

WHERE E.DEPARTMENT_ID = RESULT_MINIMO.COD_DEPART

AND E.SALARY = RESULT_MINIMO.SALARIO_MIN

AND LOWER(RESULT_MINIMO.DEPARTAMENTO) LIKE


LOWER(P_NOM_DEPART);

BEGIN

OPEN C_MAXIMO;

LOOP

FETCH C_MAXIMO INTO V_NOMBRE_DEP,


V_APELLIDO,V_SALARIO;

EXIT WHEN C_MAXIMO%NOTFOUND;


DBMS_OUTPUT.PUT_LINE ('DEPARTAMENTO:
'||V_NOMBRE_DEP||' EMPLEADO: '||V_APELLIDO ||'
SALARIO_MAXIMO: '|| V_SALARIO);

END LOOP;

CLOSE C_MAXIMO;

OPEN C_MINIMO;

LOOP

FETCH C_MINIMO INTO V_NOMBRE_DEP,


V_APELLIDO,V_SALARIO;

EXIT WHEN C_MINIMO%NOTFOUND;

DBMS_OUTPUT.PUT_LINE ('DEPARTAMENTO:
'||V_NOMBRE_DEP||' EMPLEADO: '||V_APELLIDO ||'
SALARIO_MINIMO: '|| V_SALARIO);

END LOOP;

CLOSE C_MINIMO;

END;

LINEA EJECUCION:
EXECUTE P_DEP_SALARY_MAX_MIN('IT');

RESULTADO:

REALIZADO POR: ITALO MENDIETA

REVISADO POR: ANDREA CALDERON


ENUNCIADO 2:

Realizar un procedimiento almacenado que dado la primera letra


del apellido y el nombre de departamento permita incrementar un
valor de porcentaje el sueldo y comisión de los empleados.

SOLUCION SQL:
--SET SEVEROUTPUT ON

CREATE OR REPLACE

PROCEDURE P_DEP_SUELDO(_NOM_DEP VARCHAR2,


P_LETRA_APELLIDO VARCHAR2) IS

V_APELLIDO_EMP HR.EMPLOYEES.LAST_NAME%TYPE;

V_NOMBRE_DEP HR.DEPARTMENTS.DEPARTMENT_NAME%TYPE;

CURSOR VALOR IS

SELECT E.LAST_NAME APELLIDO,

RESULTADO.NOMBRE_DEP

FROM EMPLOYEES E,

(SELECT DEP.DEPARTMENT_ID CODIGO_DEP,

DEP.DEPARTMENT_NAME NOMBRE_DEP

FROM DEPARTMENTS DEP,

EMPLOYEES EMP

WHERE DEP.DEPARTMENT_ID=EMP.DEPARTMENT_ID

GROUP BY DEP.DEPARTMENT_ID ,

DEP.DEPARTMENT_NAME

)RESULTADO

WHERE E.DEPARTMENT_ID=RESULTADO.CODIGO_DEP

AND LOWER(E.LAST_NAME) LIKE LOWER(P_LETRA_APELLIDO)

AND LOWER(RESULTADO.NOMBRE_DEP)=LOWER(P_NOM_DEP);
BEGIN

OPEN VALOR;

LOOP FETCH VALOR INTO V_APELLIDO_EMP,


V_NOMBRE_DEP;

EXIT WHEN VALOR%NOTFOUND;

DBMS_OUTPUT.PUT_LINE('DEPARTAMENTO: '||
V_NOMBRE_DEP || ' EMPELEADO: '|| V_APELLIDO_EMP);

END LOOP;

CLOSE VALOR;

END;

LINEA EJECUCION:
EXECUTE P_DEP_SUELDO('EXECUTIVE','%K%');

RESULTADO:

REALIZADO POR: ANDREA CALDERON

REVISADO POR: ITALO MENDIETA


ENUNCIADO 4:

Realizar un procedimiento almacenado que dado como parámetro


la cédula muestre en pantalla si esta correcta o incorrecta.

SOLUCION SQL:

SET SERVEROUTPUT ON;

DECLARE

cedula varchar2(10 char);

longitud number;

pp number; --numero de la posicion par

sump number;

cp number;

sumi number;

pi number;

ci number;

sumt number;

un number;

r number;

v number;

BEGIN

cedula := &INGRESE_CEDULA;

longitud := LENGTH(cedula);--Longitud del numero digitado


IF longitud = 10 then --

pp:=0;

sump:=0;

cp:=2;

LOOP

pp:= to_number(substr(cedula,cp,1)); --obtiene el dato de la


pasición par de la cédula

sump:=sump+pp;

dbms_output.put_line(pp);

cp := cp + 2;

IF cp>10 THEN

EXIT;

END IF;

END LOOP; --fin de bucle

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

sumi := 0; --suma de los números de las posiciones impares

ci := 1; --numero de la posición impar

LOOP

pi := 2 * (to_number(substr(cedula,ci,1))); --multiplica por dos


los números de las posiciones impares
IF (pi > 9) THEN --si la multiplicación es mayor que 9

pi := pi - 9; --se resta menos 9 a la multiplicación

sumi := sumi + pi; --se suman todos los números de las


posiciones impares multiplicadas por dos

ELSE --si la multiplicación no es mayor que 9

sumi := sumi + pi; --se suman todos los números de las


posiciones impares multiplicadas por dos

END IF;

dbms_output.put_line(pi);

ci:= ci + 2;

IF ci>10 THEN

EXIT;

END IF;

END LOOP;

sumt := sump + sumi; --sumar los resultados de las sumas de las


posiciones pares e impares

un := to_number(substr(cedula,9,1)); --cortar último número de


la cédula

r := sumt mod 10; --se obtiene el residuo de la suma total por


10
v:=0; --verificador

if r>0 THEN

v := 10 - r; --se obtiene el verificador

else

v := r; --verificador igual a residuo

END IF;

IF un=v THEN --si el último dígito de la cédula es igual al numero


verificador

dbms_output.put_line('Cedula VALIDA');

ELSE

dbms_output.put_line('Cedula NO VALIDA');

END IF;

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

ELSE

dbms_output.put_line('Cedula MAL INGRESADA');

END IF;

END;
REALIZADO POR: EDISON MOROCHO

REVISADO POR: ITALO MENDIETA

S-ar putea să vă placă și