 |
|
 |
Cursores en PL/SQL
Introducción a cursores PL/SQL
PL/SQL utiliza cursores para gestionar las instrucciones SELECT. Un cursor es un conjunto de registros devuelto por una instrucción SQL. Técnicamente los cursores son fragmentos de memoria que reservados para procesar los resultados de una consulta SELECT.
Podemos distinguir dos tipos de cursores:
- Cursores implicitos. Este tipo de cursores se utiliza para operaciones SELECT INTO. Se usan cuando la consulta devuelve un único registro.
- Cursores explicitos. Son los cursores que son declarados y controlados por el programador. Se utilizan cuando la consulta devuelve un conjunto de registros. Ocasionalmente también se utilizan en consultas que devuelven un único registro por razones de eficiencia. Son más rápidos.
Un cursor se define como cualquier otra variable de PL/SQL y debe nombrarse de acuerdo a los mismos convenios que cualquier otra variable. Los cursores implicitos no necesitan declaración.
El siguiente ejemplo declara un cursor explicito:
declare cursor c_paises is SELECT CO_PAIS, DESCRIPCION FROM PAISES; begin /* Sentencias del bloque ...*/ end;
|
Para procesar instrucciones SELECT que devuelvan más de una fila, son necesarios cursores explicitos combinados con un estructura de bloque.
Un cursor admite el uso de parámetros. Los parámetros deben declararse junto con el cursor.
El siguiente ejemplo muestra la declaracion de un cursor con un parámetro, identificado por p_continente.
declare cursor c_paises (p_continente IN VARCHAR2) is SELECT CO_PAIS, DESCRIPCION FROM PAISES WHERE CONTINENTE = p_continente; begin
/* Sentencias del bloque ...*/ end;
|
El siguiente diagrama representa como se procesa una instrucción SQL a través de un cursor.

Fases para procesar una instrucción SQL
|
| |
 |
vaya currada eh!
por
yo
Respuesta recibida el [12/06/2007 08:08:45]
|
 |
podrias currate un poco mas los ejemplos macho!!1 que no veas vaya mierda ejemplos has puestos
|
| |
 |
El tutorial se divide actualme...
por
Devjoker
Respuesta recibida el [12/06/2007 11:57:00]
|
 |
El tutorial se divide actualmente en 30 capitulos, este como se puede leer en el titulo es introducción a los cursores en PL/SQL.
En la parte izquierda de la página, dispones del menú del tutorial con enlaces directos a cada capitulo, y en la parte superior e inferior de la pantalla botones que te permiten navegar a través del tutorial.
Son muy fáciles de usar, ya veras como enseguida aprendes a usarlos.
|
| |
 |
eres un genio
por
gabyta
Respuesta recibida el [05/07/2007 05:04:00]
|
 |
eres muy simpatico amigo pedro herrarte
|
| |
 |
No entiendo
por
Jhonny
Respuesta recibida el [01/09/2007 12:15:08]
|
 |
Hombre!!!, tenés que ser más claro. Da un ejemplo de cursor que no se entiende.
|
| |
 |
Pues si no entiendes estos eje...
por
Luis
Respuesta recibida el [02/09/2007 08:43:02]
|
 |
Pues si no entiendes estos ejemplos mejor que te plantees dedicarte a otra cosa porque la informática no es lo tuyo
|
| |
 |
Cursor FOR
por
Juan Pablo
Respuesta recibida el [05/09/2007 04:40:14]
|
 |
declare CURSOR nombre IS /*CURSOR*/ select apellido,oficio,salario,comision from empleado; begin for fila IN nombre LOOP /*no es necesario definir esta variable*/ dbms_output.put_line(fila.apellido||' '||fila.oficio||' '||fila.salario||' '||fila.comision); END LOOP; end; /
|
| |
 |
Estoy de Acuerdo contigo Luis
por
Albert
Respuesta recibida el [09/11/2007 11:15:14]
|
 |
Creo que la explicación que estan dando en la pagina esta 100 % apto para que lo entienda cualquier programador, entonces Jhonny creo que esto no es lo tuyo dedicate a otra cosa jeje
|
| |
 |
Incultos
por
Luis
Respuesta recibida el [29/11/2007 07:54:13]
|
 |
Jhonny y yo vaya par de toca huevos, no tienen ni idea y encima piden las cosas de una manera poco decorosa. ESTUDIAR antes de criticar
|
| |
 |
Ejemplo
por
Roberto
Respuesta recibida el [30/11/2007 12:34:59]
|
 |
CREATE OR REPLACE Procedure UpdateCourse ( name_in IN varchar2 ) IS cnumber number;
cursor c1 is select course_number from courses_tbl where course_name = name_in;
BEGIN
open c1; fetch c1 into cnumber;
if c1%notfound then cnumber := 9999; end if;
insert into student_courses ( course_name, course_number) values ( name_in, cnumber );
commit;
close c1;
EXCEPTION WHEN OTHERS THEN raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM); END;
obtenido en http://www.techonthenet.com/oracle/procedures.php
|
| |
 |
Otro Ejemplo
por
Xavier
Respuesta recibida el [08/01/2008 12:23:22]
|
 |
-- se arma un cursor que levanta los registros que sean más viejos que un año -- y luego se recorre ese cursor para copiar los registros a una tabla historica. -- algo simple para ver el uso de cursores con declaracion implicita.
CURSOR cab_cur IS SELECT c_tipo_doc, n_remito_sc, f_remito FROM t_envios WHERE f_remito < ( trunc ( add_months ( sysdate , -12 ), 'month')) ORDER BY f_remito;
FOR cab_rec IN cab_cur LOOP -- declaración implicita del registro que recorre el cursor -- de esta forma no hace falta open, fetch y close del cursor
BEGIN INSERT INTO hco_envios SELECT * FROM t_envios WHERE cab_rec.c_tipo_doc = c_tipo_doc AND cab_rec.n_remito_sc = n_remito_sc;
EXCEPTION WHEN OTHERS THEN raise_application_error(-20001,'CODIGO ERROR: '||SQLCODE||' MENSAJE: '||SQLERRM); END;
END LOOP; -- fin del recorrido del cursor
|
| |
 |
A la verga
por
Miguel Guerrero
Respuesta recibida el [23/01/2008 10:22:29]
|
 |
Para Luis y Albert vayanse al carajo!!,, la neta que los ejemplos nos muy buenos.
|
| |
 |
Ejemplos
por
oracle girl
Respuesta recibida el [11/02/2008 03:02:58]
|
 |
no veo cuál es el problema, estos ejemplos son a prueba de tontos.
|
| |
 |
Ejemplos
por
oracle boy xD
Respuesta recibida el [20/03/2008 02:33:55]
|
 |
Si les ponen un ejemplo mas elaborado se van a empezar a quejar de que esta muy complejo ... -_-!
|
| |
 |
me parto el culo
por
David
Respuesta recibida el [09/04/2008 02:08:00]
|
 |
jajajajaja como me he reido con el primer comentario de esta pagina...dios mio jajajaja lo siento por el autor que por cierto ha explicado muy bien lo que son los cursores, y como se declaran. jajajajajajaja en serio que risa me ha entrado, yo estaba ahi leyendo para enterarme y plas! el comentario de "yo" juas me parto. Por cierto el tio no deberia tener ni idea del tema. Gracias por la informacion!
|
| |
 |
ERROR AL EJECUTAR SELECT
por
ROBERTO
Respuesta recibida el [24/04/2008 12:27:55]
|
 |
como puedo ignorar el error que se muestra cuando el SELECT no trae registros y se esta asignando a una variable:
select codigo into vCodigo from clientes;
|
| |
 |
Recorrer el cursor con el loop
por
Jorge Sanchez
Respuesta recibida el [13/05/2008 05:11:03]
|
 |
Mi pregunta es la siguiente es como hago para recorrer el cursor con el "for" pero que no lo haga desde el first_record sino a partir del last_record y empiece a recorrerlo al reves
|
| |
 |
Duda de un cursor
por
Bea
Respuesta recibida el [27/05/2008 02:27:30]
|
 |
Hola tengo la siguiente sentencia pero el cursor al leerlo no me recupera nada porque puede ser? Gracias. *----------------- DECLARAR-CURSOR. *----------------- EXEC SQL DECLARE CURSOR_SALDOS CURSOR FOR SELECT A.CLAVEAC, A.CODIGOISIN, A.FECHAVALORLIQ, TO_DATE (TO_CHAR(A.FECHAVALORLIQ),'YYYYMMDD'), A.FECHADIA, A.NUMEROTOTALPARTICIONES, A.VALORLIQUIDATIVO, A.SALDO, A.SALDOMEDIOMES FROM CI.SALDOSFONDOSPLANES_T A WHERE CODIGOISIN = 'ES0142233032' AND * FECHAVALORLIQ BETWEEN 20080102 AND 20080430 FECHAVALORLIQ BETWEEN 20080102 AND 20080229 ORDER BY CLAVEAC, CODIGOISIN, FECHAVALORLIQ, FECHADIA DESC END-EXEC. *----------------------- ABRIR-CURSOR. *----------------------- DISPLAY 'ABRIR CURSOR_SALDOS' MOVE 'N' TO SW-FIN-CURSOR EXEC SQL OPEN CURSOR_SALDOS END-EXEC. * DISPLAY 'ABIERTO CURSOR_SALDOS'. PERFORM CAMB-STAT-ORA. * IF DLNOT-DATA SET FIN-CURSOR TO TRUE END-IF. DISPLAY 'FIN-CURSOR......' SW-FIN-CURSOR. *------------ LEER-CURSOR. *------------ DISPLAY 'ENTRO EN LEER-CURSOR'. EXEC SQL FETCH CURSOR_SALDOS INTO :CLAVEAC-TAB, :CODIGOISIN-TAB, :FECHAVALORLIQ-TAB, :FECHAVALOCONV, :FECHADIA-TAB, :NUMEROTOTALPARTICIONES-TAB, :VALORLIQUIDATIVO-TAB, :SALDO-TAB, :SALDOMEDIOMES-TAB END-EXEC. PERFORM CAMB-STAT-ORA. IF (SQLCODE = 1403 OR SQLCODE = -1403) SET FIN-CURSOR TO TRUE END-IF.
|
| |
 |
evaluacion
por
kfigueroa
Respuesta recibida el [09/06/2008 05:25:57]
|
 |
Grande...muy bueno...me ha ayudado enormemente en dramas que tenias
|
| |
 |
como se ejecuta
por
rafa_el
Respuesta recibida el [01/08/2008 06:11:18]
|
 |
que tal, soy primerizo, tengo instalado oracle y sqlplus, quiero "ejecutar" alguno de sus codigos (claro esta que con tablas propias) para ir aprendiendo, pero no se como ejecutarlos y si llevan una sintaxis antes de sus codigos,, gracias!!!
|
| |
 |
cuidado con to_date(to_char(...
por
Horacio Miranda
Respuesta recibida el [09/09/2008 03:58:25]
|
 |
Debes tener cuidado unico con estas transformaciones, para pocos datos no te daras cuenta que estas haciendo full scan, pero cuando tengas 100 Millones de registros creeme que se notara :D
|
| |
 |
En realidad para que sirven?
por
Elliot
Respuesta recibida el [16/09/2008 04:11:22]
|
 |
Se lo basico para hacer un cursor.
DECLARE CURSOR CUR1 IS SELECT CAMPO1, CAMPO2 FROM TABLA1;
V_CAMP1 NUMBER; V_CAMP2 VARCHAR2(14); BEGIN OPEN CUR1; LOOP FETCH CUR1 INTO V_CAMP1, V_CAMP2; EXIT WHEN CUR1%NOTFOUND DBMS_OUTPUT.PUT_LINE(V_CAMP1 ||' '||V_CAMP2); END LOOP; CLOSE CUR1; END;
AHORA LO DIFICIL: desde SQL lo llamo asi SQL>@nombre_archivo
me aparecen desplegados los valores de cada campo por registro.
es lo mismo si hiciera SQL>SELECT campo1, campo2 from tabla1;
quisiera saber si hay forma de llamar a CUR1 desde SQL> sin necesidad de llamar al programa (claro que debo llamar el programa por lo menos una vez para declarar el cursor, creo que es logico )
Que utilidad tienen los cursores?
|
| |
 |
COMO DEFINO CURSORES EN SQL SERVER
por
ESOJ
Respuesta recibida el [18/09/2008 05:21:44]
|
 |
Hola buenas tardes les envio un coordial saludo a todos yo conozco muy bien los cursores de Oracle pero apenas me estoy metiendo a SQL Server 2005 y soy franco no se como definir un cursor y recorrerlo
y una duda supuestamente en comentarios que he leido y he escuchado se dice que los cursores no son muy bueno que perjudican el performance de la base de datos yo francamente los utilizo por que me ayudan en casos complejos como es poder manipular una coleccines de Datos y no creo mucho en el famoso mito de el performance
|
| |
 |
resolver este ejercicio en oracle
por
julie andrea torres
Respuesta recibida el [01/11/2008 12:40:31]
|
 |
Hola buenas tardes necesito saber como puedo resolver este ejercicio(codigo en oracle creacion tablas cursores y demas para llegar a la solucion de la pregunta): de la tabla clientes para aquellos con sede en bogota,teniendo en cuenta la direccion deben clasificarse los clientes en 5 zonas,comprendidas por el norte apartir de la calle 100,por el sur a partir de la av.1 de mayo, por el occidente a partir de la avenida boyaca,por el oriente a partir de la av.caracas y la zona central los que estan al interior de los limites enunciados.enumere los tres vendedores con los mayores recaudos por zona. Por favor si alguin me puede ayudar que lo necesito urgente gracias.....
|
| |
 |
pues no ha ido tan mal
por
pues no ha ido tan mal
Respuesta recibida el [01/12/2008 06:13:57]
|
 |
Pues entre lo que discute uno y el otro al final me ha solucionado bastantes cosas. Muchas gracias y seguid en la brecha!!
|
| |
 |
Cómo puedo??
por
xxx
Respuesta recibida el [18/12/2008 11:01:53]
|
 |
Como puedo tener relaciones sexuales con Pamela Anderson?? La verdad no quiero que ella se enamore de mi, solo quiero hacerle el sexo unas 6 veces y botarla, que le digo??? selet my_pito into your_cosa from tus_tetas_operadas where en_el_yate_de_tommy.... o le digo que nos vayamos a un motel?? ayudenme!!!
|
| Añadir comentario ... |
Para preguntar utiliza los foros
|
|

|
Cursores en PL/SQL |
|
Autor:
Pedro Herrarte Sánchez
|
|
Visitas:
93661 |
Fecha de publicación:
23/05/2006 |
Pedro Herrarte, es consultor independiente, ofreciendo servicios 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. |
|
|
Visitas:
35
|
Comentarios:
0
|
Archivo:
Articulos
|
|
Visitas:
108
|
Comentarios:
0
|
Archivo:
Articulos
|
Visitas:
155
|
Comentarios:
0
|
Archivo:
Articulos
|
Visitas:
33
|
Comentarios:
0
|
Archivo:
Articulos
|
Visitas:
285
|
Comentarios:
1
|
Archivo:
Articulos
|
Visitas:
839
|
Comentarios:
2
|
Archivo:
Articulos
|
Visitas:
712
|
Comentarios:
1
|
Archivo:
Articulos
|
Visitas:
447
|
Comentarios:
0
|
Archivo:
Articulos
|
Visitas:
1052
|
Comentarios:
1
|
Archivo:
Articulos
|
Visitas:
250
|
Comentarios:
0
|
Archivo:
Articulos
|
|
|
|
 |
| Encuesta |
|
¿A que perfil te adaptas mejor? |
|
|
|
|
|
|
|
|
 |