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 NG KING PRESIDENT CLARK MANAGER MILLER CLERK " 17-NOV-91 09-JUN-81 23-JAN-82 5000 2450 1300 Nombre de Departamento: ACCOUNTI

" Número de Departamento: 20 JONES FORD SMITH SCOTT ADAMS " MANAGER ANALYST CLERK ANALYST CLERK

Nombre de Departamento: RESEARCH 2978 3000 800 3000 1100

02-APR-81 03-DEC-81 17-DEC-80 09-DEC-82 12-JAN-83

" Número de Departamento: 30 BLAKE MARTIN ALLEN TURNER JAMES WARD " MANAGER SALESMAN SALESMAN SALESMAN CLERK SALESMAN

Nombre de Departamento: SALES 2850 1250 1600 1500 950 1250

01-MAY-81 28-SEP-91 20-FEB-81 08-SEP-81 03-DEC-81 22-FEB-81

" Número de Departamento: 40 NS " Respuesta 1) -----------SQL> edit p22q1.sql

Nombre de Departamento: OPERATIO

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 .deptno * Además crea un Registro PL/SQL dept_record con la forma: [ DEPT 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 ' Nombre de Departamento: ' v_dept_dname); DBMS_OUTPUT.PUT_LINE( ' ' ); -- Anido otro Bucle FOR para el cursor con parámetros emp_ cursor FOR o ) LOOP emp_record IN emp_cursor( v_dept_deptn 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 ----8000 7900 7844 SAL --950 1500 STARS ----********** ***************

_deptno

" 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 v_emp_stars v_emp_sal 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 EMP.EMPNO%TYPE := EMP.STARS%TYPE := EMP.SAL%TYPE; &p_emp_empno; NULL;

'*';

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 LOOP

emp_stars_cursor

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

Sign up to vote on this title
UsefulNot useful

Master Your Semester with Scribd & The New York Times

Special offer: Get 4 months of Scribd and The New York Times for just $1.87 per week!

Master Your Semester with a Special Offer from Scribd & The New York Times