Sie sind auf Seite 1von 4

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

Práctica 22: Conceptos Avanzados de los Cursores SQL Explícitos


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

Ejercicio 1:
Use un Cursor SQL Explícito para obtener el número de departamento y el nomb
re de departamento desde la
tabla DEPT. Pase el número de departamento a otro Cursor SQL Explíci
to para obtener el nombre del empleado,
el trabajo, la fecha de contratación y el salario de todos los emp
leados que trabajan en ese departamento.
"
Número de Departamento: 10 Nombre de Departamento: ACCOUNTI
NG
KING PRESIDENT 17-NOV-91 5000
CLARK MANAGER 09-JUN-81 2450
MILLER CLERK 23-JAN-82 1300
"
"
Número de Departamento: 20 Nombre de Departamento: RESEARCH
JONES MANAGER 02-APR-81 2978
FORD ANALYST 03-DEC-81 3000
SMITH CLERK 17-DEC-80 800
SCOTT ANALYST 09-DEC-82 3000
ADAMS CLERK 12-JAN-83 1100
"
"
Número de Departamento: 30 Nombre de Departamento: SALES
BLAKE MANAGER 01-MAY-81 2850
MARTIN SALESMAN 28-SEP-91 1250
ALLEN SALESMAN 20-FEB-81 1600
TURNER SALESMAN 08-SEP-81 1500
JAMES CLERK 03-DEC-81 950
WARD SALESMAN 22-FEB-81 1250
"
"
Número de Departamento: 40 Nombre de Departamento: OPERATIO
NS
"
Respuesta 1)
------------
SQL> edit p22q1.sql
Contenido del archivo de comandos con el bloque PL/SQL: p22q1.sql
-----------------------------------------------------------------
"
SET SERVEROUTPUT ON
DECLARE
CURSOR dept_cursor IS
SELECT DEPTNO, DNAME
FROM DEPT
ORDER BY DEPTNO;
v_dept_deptno DEPT.DEPTNO%TYPE;
v_dept_dname DEPT.DNAME%TYPE;
CURSOR emp_cursor
( p_deptno NUMBER ) IS
SELECT ENAME, JOB, HIREDATE, SAL
FROM EMP
WHERE DEPTNO = p_deptno;
v_emp_ename EMP.ENAME%TYPE;
v_emp_job EMP.JOB%TYPE;
v_emp_hiredate EMP.HIREDATE%TYPE;
v_emp_sal EMP.SAL%TYPE;
BEGIN
/* Bucle FOR efectúa implícitamente un OPEN y en cada iteración un FET
CH
* Además crea un Registro PL/SQL dept_record con la forma: [ DEPT
.deptno | DEPT.dname ]
* donde guarda temporalmente lo que obtiene del FETCH.
**/
FOR dept_record IN dept_cursor LOOP
v_dept_deptno := dept_record.deptno;
v_dept_dname := dept_record.dname;
DBMS_OUTPUT.PUT_LINE( 'Número de Departamento: ' || v_dept
_deptno || ' Nombre de Departamento: ' || v_dept_dname);
DBMS_OUTPUT.PUT_LINE( ' ' );
-- Anido otro Bucle FOR para el cursor con parámetros emp_
cursor
FOR emp_record IN emp_cursor( v_dept_deptn
o ) LOOP
v_emp_ename := emp_record.ename;
v_emp_job := emp_record.job;
v_emp_hiredate := emp_record.hiredate;
v_emp_sal := emp_record.sal;
DBMS_OUTPUT.PUT_LINE( v_emp_ename || ' ' || v_em
p_job || ' ' || v_emp_hiredate || ' ' || v_emp_sal );
END LOOP;
DBMS_OUTPUT.PUT_LINE( ' ' );
END LOOP; --Al finalizar el bucle FOR efectúa implícitamente un CLOS
E del Cursor SQL Explícito
END;
/
SET SERVEROUTPUT OFF;
"
SQL> start p22q1.sql
Ejercicio 2: Modifique el archivo de comandos p19q5.sql para incorporar las f
uncionalidades de las cláusulas FOR UPDATE y WHERE CURRENT OF
"
EMPNO SAL STARS
----- --- -----
8000
7900 950 **********
7844 1500 ***************
"
Contenido del archivo de comandos con el Bloque PL/SQL: p19q5.sql
-----------------------------------------------------------------
"
ACCEPT p_emp_empno PROMPT 'Por favor ingrese el número de empleado: '
;
DECLARE
v_emp_empno EMP.EMPNO%TYPE := &p_emp_empno;
v_emp_stars EMP.STARS%TYPE := NULL;
v_emp_sal EMP.SAL%TYPE;
BEGIN
SELECT NVL( ROUND( SAL / 100 ), 0 )
INTO v_emp_sal
FROM EMP
WHERE EMPNO = v_emp_empno;
FOR i in 1..v_emp_sal LOOP
v_emp_stars := v_emp_stars || '*';
END LOOP;
UPDATE EMP
SET STARS = v_emp_stars
WHERE EMPNO = v_emp_empno;
COMMIT;
END;
/
"
Respuesta 2)
------------
SQL> edit p22q2.sql
Contenido del archivo de comandos con el Bloque PL/SQL: p22q2.sql
-----------------------------------------------------------------
"
ACCEPT p_emp_empno PROMPT 'Por favor ingrese el número de empleado: '
;
DECLARE
v_emp_empno EMP.EMPNO%TYPE := &p_emp_empno;
v_emp_stars EMP.STARS%TYPE := NULL;
v_emp_sal EMP.SAL%TYPE;
CURSOR emp_stars_cursor IS
SELECT STARS
FROM EMP
WHERE EMPNO = v_emp_empno
FOR UPDATE OF STARS NOWAIT;
BEGIN
SELECT NVL( ROUND( SAL / 100 ), 0 )
INTO v_emp_sal
FROM EMP
WHERE EMPNO = v_emp_empno;
FOR i in 1..v_emp_sal LOOP
v_emp_stars := v_emp_stars || '*';
END LOOP;
/* UPDATE EMP
* SET STARS = v_emp_stars
* WHERE EMPNO = v_emp_empno;
*/
/* Bucle FOR Implícitamente Abre el Cursor emp_stars_cursor y en C
ada Iteración hace FETCH poniendo resultado en el Registro PL/SQL emp_stars_record
* que tiene la forma: [ EMP.STARS ]
*/
FOR emp_stars_record IN emp_stars_cursor
LOOP
UPDATE EMP
SET STARS = v_emp_stars
WHERE CURRENT OF emp_stars_cursor;
END LOOP;
--Cuando Finaliza el Bucle FOR implícitamente se cierra el Cursor
emp_stars_cursor
COMMIT;
END;
/
"
SQL> start p22q2.sql

Das könnte Ihnen auch gefallen