SlideShare a Scribd company logo
1 of 5
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;
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 ****');
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 *
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;
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;

More Related Content

What's hot

Tipos de datos definidos por el programador
Tipos de datos definidos por el programadorTipos de datos definidos por el programador
Tipos de datos definidos por el programador
Carlos Pes
 
PresentacióN 4
PresentacióN 4PresentacióN 4
PresentacióN 4
pokerpc
 
Ejercicio 8
Ejercicio 8Ejercicio 8
Ejercicio 8
ismaxmax
 
Clase 11 De Septiembre 2009
Clase 11 De Septiembre 2009Clase 11 De Septiembre 2009
Clase 11 De Septiembre 2009
mtemarialuisa
 
Presentación programacion
Presentación programacionPresentación programacion
Presentación programacion
Miguel Cajiga
 
Ejercicios de programacion concurrente
Ejercicios de programacion concurrenteEjercicios de programacion concurrente
Ejercicios de programacion concurrente
edgar muñoz
 
P R A C T I C A2
P R A C T I C A2P R A C T I C A2
P R A C T I C A2
climancc
 

What's hot (18)

Hack (Lenguaje de Programacion)
Hack (Lenguaje de Programacion)Hack (Lenguaje de Programacion)
Hack (Lenguaje de Programacion)
 
Introducción a TDD y PHPUnit
Introducción a TDD y PHPUnitIntroducción a TDD y PHPUnit
Introducción a TDD y PHPUnit
 
Semana 4 Javascript funciones y Metodos
Semana 4   Javascript funciones y MetodosSemana 4   Javascript funciones y Metodos
Semana 4 Javascript funciones y Metodos
 
Tipos de datos definidos por el programador
Tipos de datos definidos por el programadorTipos de datos definidos por el programador
Tipos de datos definidos por el programador
 
PresentacióN 4
PresentacióN 4PresentacióN 4
PresentacióN 4
 
03 funciones
03 funciones03 funciones
03 funciones
 
Ejercicio 8
Ejercicio 8Ejercicio 8
Ejercicio 8
 
Semana 2 Fundamentos de Python(Entradas, Salidas y Operaciones Aritméticas)
Semana 2   Fundamentos de Python(Entradas, Salidas y Operaciones Aritméticas)Semana 2   Fundamentos de Python(Entradas, Salidas y Operaciones Aritméticas)
Semana 2 Fundamentos de Python(Entradas, Salidas y Operaciones Aritméticas)
 
Practica de programacion 21 28
Practica de programacion 21 28Practica de programacion 21 28
Practica de programacion 21 28
 
Clase 11 De Septiembre 2009
Clase 11 De Septiembre 2009Clase 11 De Septiembre 2009
Clase 11 De Septiembre 2009
 
Presentación programacion
Presentación programacionPresentación programacion
Presentación programacion
 
Ejercicios de programacion concurrente
Ejercicios de programacion concurrenteEjercicios de programacion concurrente
Ejercicios de programacion concurrente
 
Utilizando DDL SQL oracle Z051 Cap 11
Utilizando DDL SQL oracle Z051 Cap 11Utilizando DDL SQL oracle Z051 Cap 11
Utilizando DDL SQL oracle Z051 Cap 11
 
Presentación 13 Paso por referencia
Presentación 13 Paso por referenciaPresentación 13 Paso por referencia
Presentación 13 Paso por referencia
 
Sesion06c - Sentencias SQL en PL-SQL (Oracle)
Sesion06c - Sentencias SQL en PL-SQL (Oracle)Sesion06c - Sentencias SQL en PL-SQL (Oracle)
Sesion06c - Sentencias SQL en PL-SQL (Oracle)
 
Plpgsql seguridad bd_postgresql_2011
Plpgsql seguridad bd_postgresql_2011Plpgsql seguridad bd_postgresql_2011
Plpgsql seguridad bd_postgresql_2011
 
P R A C T I C A2
P R A C T I C A2P R A C T I C A2
P R A C T I C A2
 
Charla Mysql
Charla MysqlCharla Mysql
Charla Mysql
 

Viewers also liked (15)

RESEARCH EXCELLENCE FRAMEWORK 2014_research power rankings in Business and Ma...
RESEARCH EXCELLENCE FRAMEWORK 2014_research power rankings in Business and Ma...RESEARCH EXCELLENCE FRAMEWORK 2014_research power rankings in Business and Ma...
RESEARCH EXCELLENCE FRAMEWORK 2014_research power rankings in Business and Ma...
 
Risalah ramadhan
Risalah ramadhanRisalah ramadhan
Risalah ramadhan
 
Pythagorean theorem and distance formula
Pythagorean theorem and distance formulaPythagorean theorem and distance formula
Pythagorean theorem and distance formula
 
Tipos de caja o torre
Tipos de caja o torreTipos de caja o torre
Tipos de caja o torre
 
Partes del computador
Partes del computadorPartes del computador
Partes del computador
 
Submitting physical
Submitting physicalSubmitting physical
Submitting physical
 
ใบงานที่5 กรด
ใบงานที่5 กรดใบงานที่5 กรด
ใบงานที่5 กรด
 
ใบงานที่ 4แบบพิมพ์ 4.1
ใบงานที่ 4แบบพิมพ์ 4.1ใบงานที่ 4แบบพิมพ์ 4.1
ใบงานที่ 4แบบพิมพ์ 4.1
 
Maquinas virtuales
Maquinas virtualesMaquinas virtuales
Maquinas virtuales
 
Dominio de base de datos
Dominio de base de datosDominio de base de datos
Dominio de base de datos
 
Esto Es Unja Prueba De Mi Pagina Web
Esto Es Unja Prueba De Mi Pagina WebEsto Es Unja Prueba De Mi Pagina Web
Esto Es Unja Prueba De Mi Pagina Web
 
Mineria en los paramos
Mineria en los paramosMineria en los paramos
Mineria en los paramos
 
типове й екстремальне у долі чіпки у романі
типове й екстремальне у долі чіпки у романітипове й екстремальне у долі чіпки у романі
типове й екстремальне у долі чіпки у романі
 
Presentación del Curso
Presentación del CursoPresentación del Curso
Presentación del Curso
 
Clase 1 5c
Clase 1 5cClase 1 5c
Clase 1 5c
 

Similar to Ejemplos u4

7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server
Corfapo
 
Documentación de pruebas del software
Documentación de pruebas del softwareDocumentación de pruebas del software
Documentación de pruebas del software
Yenny Aldana
 
4to Examen PII UNEFA
4to Examen PII  UNEFA4to Examen PII  UNEFA
4to Examen PII UNEFA
Javier Rivera
 

Similar to Ejemplos u4 (20)

Ejercicios resueltos de_pl-sql
Ejercicios resueltos de_pl-sqlEjercicios resueltos de_pl-sql
Ejercicios resueltos de_pl-sql
 
Triggers en SQL
Triggers en SQLTriggers en SQL
Triggers en SQL
 
Javascript es6-ejercicios-resueltos-parte-2
Javascript es6-ejercicios-resueltos-parte-2Javascript es6-ejercicios-resueltos-parte-2
Javascript es6-ejercicios-resueltos-parte-2
 
Reporte final-dinamica-de-robots
Reporte final-dinamica-de-robotsReporte final-dinamica-de-robots
Reporte final-dinamica-de-robots
 
Forms 10g procedimientos y cursores
Forms 10g procedimientos y cursoresForms 10g procedimientos y cursores
Forms 10g procedimientos y cursores
 
Cursores
CursoresCursores
Cursores
 
Sesion08 - Cursores (Oracle)
Sesion08 - Cursores (Oracle)Sesion08 - Cursores (Oracle)
Sesion08 - Cursores (Oracle)
 
CURSORES
CURSORESCURSORES
CURSORES
 
CURSORES
CURSORESCURSORES
CURSORES
 
Base datos mysql y visual basic
Base datos mysql y visual basicBase datos mysql y visual basic
Base datos mysql y visual basic
 
Command oracle
Command oracleCommand oracle
Command oracle
 
Informe tecnicou1
Informe tecnicou1Informe tecnicou1
Informe tecnicou1
 
7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server
 
Replica
ReplicaReplica
Replica
 
Sesion05 - Manipulacion de datos (Oracle)
Sesion05 - Manipulacion de datos (Oracle)Sesion05 - Manipulacion de datos (Oracle)
Sesion05 - Manipulacion de datos (Oracle)
 
Documentación de pruebas del software
Documentación de pruebas del softwareDocumentación de pruebas del software
Documentación de pruebas del software
 
Ejercicio Práctico de Base de Datos
Ejercicio Práctico de Base de DatosEjercicio Práctico de Base de Datos
Ejercicio Práctico de Base de Datos
 
Sesion10 - Funciones y procedimientos (Oracle)
Sesion10 - Funciones y procedimientos (Oracle)Sesion10 - Funciones y procedimientos (Oracle)
Sesion10 - Funciones y procedimientos (Oracle)
 
4to Examen PII UNEFA
4to Examen PII  UNEFA4to Examen PII  UNEFA
4to Examen PII UNEFA
 
Modelo Persistente
Modelo PersistenteModelo Persistente
Modelo Persistente
 

Ejemplos u4

  • 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;