1. Instituto Tecnológico de Querétaro
Asignatura: Taller de Base Datos
Docente: Alejandro Hernández Villalobos
Ejemplo1 (Declaración de cursores):
DECLARE
-- cursor sin parametros --
CURSOR dept_cursor IS
SELECT *
FROM dept;
-- cursor con parametros --
CURSOR emp_cursor(p_deptno IN NUMBER) IS
SELECT empno, ename
FROM EMP
WHERE deptno = p_deptno;
BEGIN
NULL;
END;
Ejemplo2 (Instrucciones OPEN, FETCH, CLOSE):
1) Ejecuta el siguiente query , en un SQLWorkSheet:
SELECT *
FROM dept;
2) Abre un segundo SQL WorkSheet y corre el siguiente bloque PLSQL.
DECLARE
-- cursor sin parametros --
CURSOR dept_cursor IS
SELECT *
FROM dept;
-- cursor con parametros --
CURSOR emp_cursor(p_deptno IN NUMBER) IS
SELECT empno, ename
FROM EMP
WHERE deptno = p_deptno;
-- variable de tipo registro de la tabla dept --
Var_dept dept%rowtype;
-- variable de tipo registro del cursor dept_cursor --
Var_dept_cursor dept_cursor%rowtype;
N_DEPTNO NUMBER(2,0);
V2_DNAME VARCHAR2(14);
V2_LOC VARCHAR2(13);
BEGIN
pmsj.depurarmsj;
-- Utilizando una variable para cada campo --
OPEN dept_cursor;
2. Instituto Tecnológico de Querétaro
Asignatura: Taller de Base Datos
Docente: Alejandro Hernández Villalobos
FETCH dept_cursor INTO N_DEPTNO, V2_DNAME, V2_LOC;
CLOSE dept_cursor;
pmsj.insmsj('***** Utilizando una variable para cada campo ****');
pmsj.insmsj('No. departamento: ' || N_DEPTNO || ' Nombre departamento: ' ||
V2_DNAME || ' Localización departamento: ' || V2_LOC);
OPEN dept_cursor;
FETCH dept_cursor INTO Var_dept;
CLOSE dept_cursor;
pmsj.insmsj('***** Utilizando una variable de tipo registro de tabla emp ****');
pmsj.insmsj('No. departamento: ' || Var_dept.DEPTNO || ' Nombre departamento: ' ||
Var_dept.DNAME || ' Localización departamento: ' || Var_dept.loc);
OPEN dept_cursor;
FETCH dept_cursor INTO Var_dept_cursor ;
CLOSE dept_cursor;
pmsj.insmsj('***** Utilizando una variable de tipo registro de tabla emp ****');
pmsj.insmsj('No. departamento: ' || Var_dept_cursor.DEPTNO || ' Nombre
departamento: ' || Var_dept_cursor.DNAME || ' Localización departamento: ' ||
Var_dept_cursor.loc);
END;
/
SELECT *
FROM vmsj;
Ejemplo 3 (Recuperando mas de un registro)
DECLARE
-- cursor sin parametros --
CURSOR dept_cursor IS
SELECT *
FROM dept;
-- cursor con parametros --
CURSOR emp_cursor(p_deptno IN NUMBER) IS
SELECT empno, ename
FROM EMP
WHERE deptno = p_deptno;
-- variable de tipo registro del cursor dept_cursor --
Var_dept_cursor dept_cursor%rowtype;
BEGIN
pmsj.depurarmsj;
OPEN dept_cursor;
FETCH dept_cursor INTO Var_dept_cursor ;
pmsj.insmsj('***** Primer Fetch ****');
3. Instituto Tecnológico de Querétaro
Asignatura: Taller de Base Datos
Docente: Alejandro Hernández Villalobos
pmsj.insmsj('No. departamento: ' || Var_dept_cursor.DEPTNO || ' Nombre
departamento: ' || Var_dept_cursor.DNAME || ' Localización departamento: ' ||
Var_dept_cursor.loc);
FETCH dept_cursor INTO Var_dept_cursor ;
pmsj.insmsj('***** Segundo Fetch ****');
pmsj.insmsj('No. departamento: ' || Var_dept_cursor.DEPTNO || ' Nombre
departamento: ' || Var_dept_cursor.DNAME || ' Localización departamento: ' ||
Var_dept_cursor.loc);
CLOSE dept_cursor;
END;
/
SELECT *
FROM vmsj;
Ejemplo 4 (Recuperando todos los registros de un cursor):
DECLARE
-- cursor sin parametros --
CURSOR dept_cursor IS
SELECT *
FROM dept;
-- cursor con parametros --
CURSOR emp_cursor(p_deptno IN NUMBER) IS
SELECT empno, ename
FROM EMP
WHERE deptno = p_deptno;
-- variable de tipo registro del cursor dept_cursor --
Var_dept_cursor dept_cursor%rowtype;
BEGIN
pmsj.depurarmsj;
OPEN dept_cursor;
LOOP
FETCH dept_cursor INTO Var_dept_cursor;
EXIT WHEN dept_cursor%NOTFOUND;
-- Despues del exit van todas las operaciones que le queramos hacer a los datos
pmsj.insmsj('No. departamento: ' || Var_dept_cursor.DEPTNO || ' Nombre
departamento: ' || Var_dept_cursor.DNAME || ' Localización departamento: ' ||
Var_dept_cursor.loc);
END LOOP;
CLOSE dept_cursor;
END;
/
SELECT *
4. Instituto Tecnológico de Querétaro
Asignatura: Taller de Base Datos
Docente: Alejandro Hernández Villalobos
FROM vmsj;
Ejemplo 5 (Cursores explícitos parametrizados):
DECLARE
-- cursor sin parametros --
CURSOR dept_cursor IS
SELECT *
FROM dept;
-- cursor con parametros --
CURSOR emp_cursor(p_deptno IN NUMBER) IS
SELECT empno, ename
FROM EMP
WHERE deptno = p_deptno;
-- variable de tipo registro del cursor dept_cursor --
Var_dept_cursor dept_cursor%rowtype;
Var_emp_cursor emp_cursor%rowtype;
BEGIN
pmsj.depurarmsj;
OPEN dept_cursor;
LOOP
FETCH dept_cursor INTO Var_dept_cursor;
EXIT WHEN dept_cursor%NOTFOUND;
-- Despues del exit van todas las operaciones que le queramos hacer a los datos
pmsj.insmsj('------ No. departamento: ' || Var_dept_cursor.DEPTNO || ' Nombre
departamento: ' || Var_dept_cursor.DNAME || ' Localización departamento: ' ||
Var_dept_cursor.loc || ' ------');
OPEN emp_cursor(p_deptno => Var_dept_cursor.DEPTNO);
LOOP
FETCH emp_cursor INTO var_emp_cursor;
EXIT WHEN emp_cursor%NOTFOUND;
pmsj.insmsj(' No. Empleado: ' || var_emp_cursor.empno || ' Nombre empleado:
' || var_emp_cursor.ename);
END LOOP;
CLOSE emp_cursor;
END LOOP;
CLOSE dept_cursor;
END;
/
SELECT *
FROM vmsj;
5. Instituto Tecnológico de Querétaro
Asignatura: Taller de Base Datos
Docente: Alejandro Hernández Villalobos
Ejemplo 6 (Cursores explícitos con FOR IN):
1) Ejecuta el siguiente query , en un SQLWorkSheet:
SELECT a.empno, a.ename, a.job, b.dname, nvl(c.empno, -1) empno_mgr, nvl(c.ename,
'No tiene jefe') ename_mgr
FROM emp a,
dept b,
emp c
WHERE a.deptno = b.deptno
AND a.mgr = c.empno (+);
2) Abre un segundo SQL WorkSheet y corre el siguiente bloque PLSQL.
DECLARE
CURSOR cursor_dept IS
SELECT a.empno, a.ename, a.job, b.dname, nvl(c.empno, -1) empno_mgr,
nvl(c.ename, 'No tiene jefe') ename_mgr
FROM emp a,
dept b,
emp c
WHERE a.deptno = b.deptno
AND a.mgr = c.empno (+);
registro_dept cursor_dept%rowtype;
BEGIN
pmsj.depurarmsj;
FOR registro_dept IN cursor_dept
LOOP
pmsj.insmsj('El empleado no.: ' || registro_dept.empno || ' de apellido ' ||
registro_dept.ename || ' y puesto ' || registro_dept.job || ' tiene un jefe de nombre "' ||
registro_dept.ename_mgr || '"');
END LOOP;
END;
/
SELECT *
FROM vmsj;