Sunteți pe pagina 1din 5

Introduction to Oracle: SQL and PL/SQL, Instructor Guide, Volumen 1

Práctica 21: Escribiendo Cursores SQL Explícitos


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

Ejercicio 1:
Ejecute el archivo de comandos lab21_1.sql para crear una tabla nueva qu
e almacene los empleados y sus salarios.
SQL> CREATE TABLE top_dogs
(name VARCHAR2(25),
salary NUMBER(11,2));
Respuesta 1)
------------
SQL> CREATE TABLE top_dogs
(name VARCHAR2(25),
salary NUMBER(11,2));

Ejercicio 2: Cree un Bloque PL/SQL que determine los empleados top con respec
to a sus salarios.
a) Acepte un número "n" como entrada de usuario con un parámetro de
sustitución de SQL*PLUS
b) En un Bucle obtenga los apellidos y salarios de las top-n per
sonas con respecto a sus salarios en la tabla EMP
c) Almacene los nombres y salarios en la tabla TOP_DOGS
d) Asuma que dos empleados no tienen el mismo salario
d) Testee una variedad de casos especiales, tales como n = 0, o
donde n es mayor que el número de empleados en la tabla EMP.
Vacíe la tabla TOP_DOGS despúes de cada prueba.
"
Por favor ingrese el número de empleados tops que mas gene
ran dinero: 5
NAME SALARY
---- ------
KING 5000
FORD 3000
SCOTT 3000
JONES 2975
BLAKE 2850
"
Respuestas 2.a), 2.b), 2.c) y 2.d)
----------------------------------
SQL> edit p21q2.sql
Contenido del archivo de comandos con el Bloque PL/SQL: p21q2.sql
-----------------------------------------------------------------
"
ACCEPT p_num PROMPT 'Por favor ingrese el número de empleados tops que
mas generan dinero: ';
DECLARE
v_num NUMBER := &p_num;
v_ename EMP.ENAME%TYPE;
v_sal EMP.SAL%TYPE;
CURSOR emp_cursor IS
SELECT ENAME, NVL( SAL, 0 )
FROM EMP
ORDER BY NVL( SAL, 0 ) DESC;
BEGIN
OPEN emp_cursor;
FOR i in 1..v_num LOOP
FETCH emp_cursor INTO v_ename, v_sal;
INSERT INTO TOP_DOGS
VALUES ( v_ename, v_sal );
END LOOP;
COMMIT;
CLOSE emp_cursor;
END;
/
SELECT NAME, SALARY
FROM TOP_DOGS;
"
SQL> start p21q2.sql
Con n = 5 Procedimiento PL/SQL terminado correctamente.
NAME SALARY
---- ------
KING 5010
FORD 3000
SCOTT 3000
JONES 2975
BLAKE 2851
Para vaciar la tabla TOP_DOGS:
SQL> TRUNCATE TABLE TOP_DOGS;
SQL> start p21q2.sql
Con n = 0 Procedimiento PL/SQL terminado correctamente.
ninguna fila seleccionada
SQL> start p21q2.sql
Con n = 50 Procedimiento PL/SQL terminado correctamente.
NAME SALARY
---- ------
KING 5010
FORD 3000
SCOTT 3000
JONES 2975
BLAKE 2851
ALLEN 2600
CLARK 2453
TURNER 1500
MILLER 1300
JAMES 1254
MARK 1254
MARTIN 1250
ADAMS 1100
SMITH 800
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
DOE 0
50 filas seleccionadas.
Para vaciar la tabla TOP_DOGS:
SQL> TRUNCATE TABLE TOP_DOGS;
No está completamente correcto.
Respuesta del Apéndice A-74
---------------------------
Contenido del archivo de comandos con el bloque PL/SQL: p21q2_v2.sql
--------------------------------------------------------------------
"
ACCEPT p_num PROMPT 'Por favor ingrese el número de empleados tops que
mas generan dinero: ';
DECLARE
v_num NUMBER(3) := &p_num;
v_ename EMP.ENAME%TYPE;
v_sal EMP.SAL%TYPE;
CURSOR emp_cursor IS
SELECT ENAME, SAL
FROM EMP
WHERE SAL IS NOT NULL
ORDER BY SAL DESC;
BEGIN
OPEN emp_cursor;
FETCH emp_cursor INTO v_ename, v_sal;
WHILE emp_cursor%ROWCOUNT <= v_num AND emp_cursor%FOUND
LOOP
INSERT INTO TOP_DOGS
VALUES ( v_ename, v_sal );
FETCH emp_cursor INTO v_ename, v_sal;
END LOOP;
CLOSE emp_cursor;
COMMIT;
END;
/
SELECT NAME, SALARY
FROM TOP_DOGS;
"
Ejercicio 3: Considere el caso donde varios empleados tienen el mismo salario
. Si una persona es listada, entonces
todas las personas con el mismo salario también deberían ser listada
s.
a) Por ejemplo, si el usuario ingresa un valor 2 para "n", enton
ces King, Ford y Scott deberían ser mostrados
(Estos empleados son los que tienen el segundo salario mas al
to).
b) Si el usuario ingresa un valor 3 para "n" entonces King, Ford
, Scott y Jones deberían ser mostrados.
c) Elimine todos los registros desde la tabla TOP_DOGS y testee
la práctica.
"
Por favor ingrese el número de empleados tops que mas gene
ran dinero: 2
NAME SALARY
---- ------
KING 5000
FORD 3000
SCOTT 3000
"
"
Por favor ingrese el número de empleados tops que mas gene
ran dinero: 3
NAME SALARY
---- ------
KING 5000
FORD 3000
SCOTT 3000
JONES 2975
"
Respuesta del Apéndice A-75
---------------------------
Contenido del archivo de comandos con el Bloque PL/SQL: p21q3.sql
"
ACCEPT p_num PROMPT 'Por favor ingrese el número de empleados tops que
mas generan dinero: ';
DECLARE
v_num NUMBER(3) := &p_num;
v_ename EMP.ENAME%TYPE;
v_current_sal EMP.SAL%TYPE;
v_last_sal EMP.SAL%TYPE;
CURSOR emp_cursor IS
SELECT ENAME, SAL
FROM EMP
WHERE SAL IS NOT NULL
ORDER BY SAL DESC;
BEGIN
OPEN emp_cursor;
FETCH emp_cursor INTO v_ename, v_current_sal;
WHILE emp_cursor%ROWCOUNT <= v_num AND emp_cursor%FOUND
LOOP
INSERT INTO TOP_DOGS
VALUES ( v_ename, v_current_sal );
v_last_sal := v_current_sal;
FETCH emp_cursor INTO v_ename, v_current_sal;
IF v_last_sal = v_current_sal THEN
v_num := v_num + 1;
END IF;
END LOOP;
CLOSE emp_cursor;
COMMIT;
END;
/
SELECT NAME, SALARY
FROM TOP_DOGS;
"