InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
Tutorial PL/SQL
Introducción a PLSQL
Programación con PL/SQL
Fundamentos de PL/SQL
Tipos de datos en PL/SQL
Operadores en PL/SQL
Estructuras de control en PL/SQL
Bloques PL/SQL
Cursores en PL/SQL
Cursores Implicitos en PL/SQL
Cursores Explicitos en PL/SQL
Cursores de actualización en PL/SQL
Excepciones en PL/SQL
Excepciones personalizadas en PL/SQL
Propagacion de excepciones en PL/SQL
Subprogramas en PL/SQL
Procedimientos almacenados en PL/SQL
Funciones en PL/SQL
Triggers en PL/SQL
Subprogramas en bloques anónimos
Paquetes en PL/SQL
Registros PL/SQL
Tablas PL/SQL
Tipo VARRAY
BULK COLLECT
Transacciones con PL/SQL
Transacciones autónomas
SQL Dinamico
Funciones integradas de PL/SQL
Secuencias
PL/SQL y Java
También puedes ver ...
Excepciones personalizadas en PL/SQL
Como conectar a ORACLE con Java
Recuperar datos BLOB de ORACLE
Trabajar con datos de tipo BLOB en ORACLE
Secuencias
PL/SQL y Java
SQL Dinamico
Transacciones autónomas
Funciones integradas de PL/SQL
Transacciones con PL/SQL

Afiliados
La Web del programador
MundoProgramacion


 

Cursores Explicitos en PL/SQL

Declaración de cursores explicitos

    Los cursores explicitos se emplean para realizar consultas SELECT que pueden devolver cero filas, o más de una fila.

    Para trabajar con un cursor explicito necesitamos realizar las siguientes tareas:

  • Declarar el cursor.
  • Abrir el cursor con la instrucción OPEN.
  • Leer los datos del cursor con la instrucción FETCH.
  • Cerrar el cursor y liberar los recursos con la instrucción CLOSE.

    Para declarar un cursor debemos emplear la siguiente sintaxis:


CURSOR nombre_cursor IS instrucción_SELECT

    También debemos declarar los posibles parametros que requiera el cursor:


CURSOR nombre_cursor(param1 tipo1, ..., paramN tipoN) IS instrucción_SELECT

    Para abrir el cursor


OPEN nombre_cursor;
     o bien (en el caso de un cursor con parámetros)
     OPEN nombre_cursor(valor1, valor2, ..., valorN);

    Para recuperar los datos en variables PL/SQL.


FETCH nombre_cursor INTO lista_variables;
-- o bien ...
FETCH nombre_cursor INTO registro_PL/SQL;

    Para cerrar el cursor:


CLOSE nombre_cursor;

    El siguiente ejemplo ilustra el trabajo con un cursor explicito. Hay que tener en cuenta que al leer los datos del cursor debemos hacerlo sobre variables del mismo tipo de datos de la tabla (o tablas) que trata el cursor.


DECLARE
  CURSOR cpaises
IS
  SELECT CO_PAIS, DESCRIPCION, CONTINENTE
  FROM PAISES;



  co_pais VARCHAR2(3);
  descripcion VARCHAR2(50);
  continente  VARCHAR2(25);
BEGIN
  OPEN cpaises;
  FETCH cpaises INTO co_pais,descripcion,continente;
  CLOSE cpaises;
END;

    Podemos simplificar el ejemplo utilizando el atributo de tipo %ROWTYPE sobre el cursor.


DECLARE
  CURSOR cpaises
IS
  SELECT CO_PAIS, DESCRIPCION, CONTINENTE
  FROM PAISES;
 
  registro cpaises%ROWTYPE;
BEGIN
  OPEN cpaises;
  FETCH cpaises INTO registro;
  CLOSE cpaises;
END;

    El mismo ejemplo, pero utilizando parámetros:


DECLARE
  CURSOR cpaises (p_continente VARCHAR2)
IS
  SELECT CO_PAIS, DESCRIPCION, CONTINENTE
  FROM PAISES
WHERE CONTINENTE = p_continente;
 
  registro cpaises%ROWTYPE;
BEGIN
  OPEN cpaises('EUROPA');
  FETCH cpaises INTO registro;
  CLOSE cpaises;
END;

     Cuando trabajamos con cursores debemos considerar:

  • Cuando un cursor está cerrado, no se puede leer.
  • Cuando leemos un cursor debemos comprobar el resultado de la lectura utilizando los atributos de los cursores.
  • Cuando se cierra el cursor, es ilegal tratar de usarlo.
  • Es ilegal tratar de cerrar un cursor que ya está cerrado o no ha sido abierto

Atributos de cursores

Toman los valores TRUE, FALSE o NULL dependiendo de la situación:
 

AtributoAntes de abrirAl abrirDurante la recuperaciónAl finalizar la recuperaciónDespués de cerrar
%NOTFOUNDORA-1001NULLFALSETRUEORA-1001
%FOUNDORA-1001NULLTRUEFALSEORA-1001
%ISOPENFALSETRUETRUETRUEFALSE
%ROWCOUNTORA-10010***ORA-1001

 

* Número de registros que ha recuperado hasta el momento
** Número de total de registros

Manejo del cursor

    Por medio de ciclo LOOP podemos iterar a través del cursor. Debe tenerse cuidado de agregar una condición para salir del bucle:

    Vamos a ver varias formas de iterar a través de un cursor. La primera es utilizando un bucle LOOP con una sentencia EXIT condicionada:

    
OPEN nombre_cursor; LOOP FETCH nombre_cursor INTO lista_variables; EXIT WHEN nombre_cursor%NOTFOUND; /* Procesamiento de los registros recuperados */ END LOOP; CLOSE nombre_cursor;

    Aplicada a nuestro ejemplo anterior:


DECLARE

CURSOR cpaises
IS
SELECT CO_PAIS, DESCRIPCION, CONTINENTE
FROM PAISES;

co_pais VARCHAR2(
3);
descripcion VARCHAR2(
50);
continente VARCHAR2(
25);
BEGIN
OPEN cpaises;
LOOP
FETCH cpaises INTO co_pais,descripcion,continente;
EXIT WHEN cpaises%NOTFOUND;
dbms_output.put_line(descripcion);
END LOOP;
CLOSE cpaises;
END;

     

    Otra forma es por medio de un bucle WHILE LOOP. La instrucción FECTH aparece dos veces.

    
OPEN nombre_cursor; FETCH nombre_cursor INTO lista_variables; WHILE nombre_cursor%FOUND
LOOP /* Procesamiento de los registros recuperados */ FETCH nombre_cursor INTO lista_variables; END LOOP; CLOSE nombre_cursor;

 

DECLARE
CURSOR cpaises
IS
SELECT CO_PAIS, DESCRIPCION, CONTINENTE
FROM PAISES;

co_pais VARCHAR2(
3);
descripcion VARCHAR2(
50);
continente VARCHAR2(
25);
BEGIN
OPEN cpaises;
FETCH cpaises INTO co_pais,descripcion,continente;
WHILE cpaises%found
LOOP
dbms_output.put_line(descripcion);
FETCH cpaises INTO co_pais,descripcion,continente;
END LOOP;
CLOSE cpaises;
END;

   Por último podemos usar un bucle FOR LOOP. Es la forma más corta ya que el cursor es implicitamente se ejecutan las instrucciones OPEN, FECTH y CLOSE.


FOR variable IN nombre_cursor LOOP /* Procesamiento de los registros recuperados */ END LOOP;


 


BEGIN
FOR REG IN (SELECT * FROM PAISES)
LOOP
dbms_output.put_line(reg.descripcion);
END LOOP;
END;


Inicio | Tutorial PL/SQL Cursores Implicitos en PL/SQLTutorial PL/SQLCursores de actualización en PL/SQL Versión para imprimir Foros de consulta

 
Felicitaciones por Maggie
Respuesta recibida el [27/06/2007 12:05:23]
Muchas felicitaciones por tu sitio, es genial, sigue adelante por favor.

 
g por anonimo
Respuesta recibida el [06/08/2007 05:48:10]
very good man

 
HOLa por ALEX
Respuesta recibida el [21/09/2007 02:32:52]
acabo de isntalar sql y ya cree dos usuarios pero cuando quiero conectarme es decir poner el comando connect me manda error no se que estoy haciendo mal??'

 
excelente por rmartinez
Respuesta recibida el [22/09/2007 09:34:21]
Excelente Curso!!

 
Perfecto! por OsKr
Respuesta recibida el [27/11/2007 07:58:38]
La página está increible, es muy clara y completa.
Gracias x compartir tu conocimiento Pedro!

 
consulta por valeria
Respuesta recibida el [05/12/2007 06:22:03]
Es muy claro lo que ecplican pero me queda una duda: cuando se cargan los datos en el cursor, al hacer el open o al hacer el fetch?? en otras palabras quiero saber en que momento tengo que formatear las variables auxiliares que tengo en los campos del where.
Gracias

 
Listas de Valores por ellerysammy
Respuesta recibida el [18/12/2007 02:28:47]
Estoy trabajando con Form de Oracle te queria preguntar si esta a tu alcanze decirme si es pocsible llenar una LOV(Lista de Valores) con los datos extraidos en un cursor o en un arreglo, he estado intentando pero no me sale, te agradeceria me ayudaras

 
re: consulta por valeria por Martín
Respuesta recibida el [02/01/2008 12:02:23]
Valeria, los datos se cargan en el cursor cuando lo definis.
cursor nombre_cursor is
select col1, col2
from tabla_1
ahí.
Y si lo cargas en una variable, parece que es con fetch nombre_cursor into variables ... saludos

 
Excelente!!! por Tincho
Respuesta recibida el [26/02/2008 09:12:16]
La verdad que tus cursos estan muy bien diseñados... hay que saber trasmitir... y la verdad que eso se evidencia en el tuto. Gracias!!! por no ser mesquino. bay

 
excelente pero bue... por matanga
Respuesta recibida el [26/02/2008 09:16:36]
la verdad es que a tincho lo tengo al lado haciendo  una capacitacion y no entiende nada, pero el curso esta muy bueno, me pregunta todo lo que lee  

 
excelente por chuchu
Respuesta recibida el [26/02/2008 12:17:31]
excelente el tutorail, me sirvio de mucho

 
EXCELENTE por ZULMISSS
Respuesta recibida el [28/02/2008 08:00:04]
FELICITACIONES TRABAJAMOS EN BASE A ESTE TUTORIAL INFINITAS GRACIAS

 
Buenisimo por HLE
Respuesta recibida el [05/03/2008 02:47:53]
Excelente manual, siempre lo utilizo como referencia, que bueno que algo de esta calidad se pueda encontrar gratis en la red.

 
Presiso por Dj_kamus
Respuesta recibida el [03/04/2008 01:45:43]
esta super bien explicado, muchas gracias

 
excelebte por zague
Respuesta recibida el [13/04/2008 09:51:12]
Me esta sirvendo mucho te lo agradesco de verdad ESTA MUY BIEN TRABAJADO FELICIDADES

 
GRACIAS!!! por ALVRZ!
Respuesta recibida el [15/04/2008 01:56:37]
e estado todo el día estudiando PL/SQL, y solo e logrado comprender leyendo de tu sitio! muchas gracias man sigue asi!

WOOOOW!

 
cursor bucle FOR...IN..LOOP por nuno
Respuesta recibida el [29/05/2008 03:39:09]
Hola, 

Mi pregunta es si uso un cursor con bucle FOR...IN..LOOP para updatear un campo del select de ese mismo curosr, lo cierro con END LOOP y lo vuelvo a abrir con FOR...IN..LOOP, se veran los cambios de dicha actualizacio en la nueva select dentro del nuevo bucle?

Gracias en adelanto,

nuno

 
hola tienes un buen tutorial p... por Anónimo
Respuesta recibida el [07/08/2008 04:51:11]
hola tienes un buen tutorial pero es que no se como utilizar esta instruccion imagine que me imprimia de una vez, pero solo me sale procedimiento terminado correctamente  no se como imprimir luego dbms_output.put_line(reg.descripcion);


Añadir comentario ... Para preguntar utiliza los foros
Autor:

Título:


Para preguntar utiliza los foros.



Inicio | Tutorial PL/SQL Cursores Implicitos en PL/SQLTutorial PL/SQLCursores de actualización en PL/SQL Versión para imprimir

Cursores Explicitos en PL/SQL
Autor: Pedro Herrarte Sánchez
Visitas: 68531 Fecha de publicación: 24/05/2006
Pedro Herrarte, es consultor independiente, ofreciendo sercivios de consultoría, análisis, desarrollo y formación.

Posee mas de diez años de experiencia trabajando para las principales empresas de España.

Es especialista en tecnologías .NET, entornos Web, bases de datos (SQL Server y ORACLE) e integración de sistemas.

Es experto en desarrollo (C#, ASP.NET, VB.Net, T-SQL, PL/SQL, , ASP, CGI , C, Pro*C, Java, Essbase, Vignette, PowerBuilder y Visual Basic ...) y bases de datos (SQL Server y ORACLE).

Es fundador, diseñador y programador de www.devjoker.com.




18/08/2008 SQL Server 2008
Visitas: 39 | Comentarios: 0 | Archivo: Articulos
Categorias: Transact-SQL
Visitas: 131 | Comentarios: 0 | Archivo: Articulos
Categorias: C#|ADO.NET|LinQ
Visitas: 161 | Comentarios: 1 | Archivo: Articulos
Categorias: Humor
Visitas: 154 | Comentarios: 0 | Archivo: Articulos
Categorias: WCF
Visitas: 123 | Comentarios: 0 | Archivo: Articulos
Categorias: WCF
Visitas: 210 | Comentarios: 0 | Archivo: Articulos
Categorias: ASP.NET
Visitas: 277 | Comentarios: 5 | Archivo: Articulos
Categorias: ASP.NET
Visitas: 4990 | Comentarios: 4 | Archivo: Articulos
Categorias: C#|Transact-SQL|LinQ
Visitas: 602 | Comentarios: 1 | Archivo: Articulos
Categorias: Visual Studio
Visitas: 1402 | Comentarios: 1 | Archivo: Articulos
Categorias: Transact-SQL

Útimos temas recibidos en los foros ...
Y lo mismo en WEB por systemat ... [C#] 1 18/08/2008
Manual del minicom de Linux con fotos. por Meta ... [UNIX] 4 17/08/2008
PROGRAMACION por JUANMA ... [Visual Basic .NET] 1 19/08/2008
Conectar ASP con B.D Informix por Franco ... [ASP] 9 02/05/2007
Codigo salir por Jazmin ... [ASP.NET] 1 18/08/2008
EXPORTAR DATOS A ARCHIVOS PLANOS. por WIX ... [ORACLE] 10 06/08/2007
formulario por artdark ... [C#] 2 04/08/2008
Codigo salir por Jazmin ... [ASP.NET] 0 18/08/2008
cambiar de modo un gried view por ivan ... [ASP.NET] 0 18/08/2008
ayuda urgente porfavor por vicancer ... [ASP.NET] 0 18/08/2008
pollo por hajaj ... [Actualidad] 1 15/08/2008
DIOS TE BENDIGA por El You ... [WIN 98/NT/2000/XP] 1 16/08/2008

Access CGI JSP ORACLE UNIX
Actualidad HTML/DHTML/XHTML LINUX PHP Visual Basic .NET
ASP ISAPI MS DOS Power Builder Visual Basic 6.0
ASP.NET Java mySQL SQL WIN 98/NT/2000/XP
C# JavaScript Opinion SQL Server

devjoker  Te recomendamos además ...
03/10/2006 Fundamentos de C#    forma parte de...Tutorial C#
19/09/2006 Recuperar datos BLOB de ORACLE
04/07/2007 ¿Cómo crear RSS?    forma parte de...Tutorial RSS
04/07/2007 ¿Cómo se usa el RSS?    forma parte de...Tutorial RSS
03/04/2008 LINQ con métodos Extensores y expresiones lambda    forma parte de...Linq y Métodos extensores
14/05/2007 Fundamentos de Transact SQL    forma parte de...Tutorial de Transact SQL
01/01/2005 Conceptos básicos.    forma parte de...Iniciación a las bases de datos
01/01/2005 Introducción a las bases de datos    forma parte de...Iniciación a las bases de datos
01/01/2006 Borrado de datos. DELETE    forma parte de...Tutorial SQL
22/10/2005 Actualización de datos. UPDATE    forma parte de...Tutorial SQL

 

Encuesta
Si trabajas con .NET ¿Que entorno utilizas?
[Ver] [Votar]