Cursores en Oracle
Un cursor es una instrucción SELECT que se define dentro de la sección de declaración de su código PLSQL. Técnicamente los cursores son fragmentos de memoria reservados para procesar los resultados de una consulta SELECT.
Declaración de un cursor.- Existen tres sintaxis diferentes para declarar un cursor.
1.- Cursor sin parámetros.
Declarar un cursor sin ningún parámetro es el cursor más simple y fácil de utilizar.
Sintaxis
La sintaxis para un cursor sin parámetros es:
1 2 |
CURSOR NOMBRE_CURSOR IS DECLARACION_SELECT; |
Se puede definir un cursor llamado c1 como se muestra a continuación.
1 2 3 4 5 |
CURSOR C1 IS SELECT CODIGOALUMNO, NOMBREALUMNO FROM ALUMNO WHERE CICLO = P_CICLO; |
Este cursor mostrara el nombre de todos los alumnos de un ciclo definido
Como utilizar un cursor dentro de un procedimiento almacenado.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
CREATE OR REPLACE PROCEDURE P_ACT_ALUMNO(P_CICLO IN ALUMNO.CICLO%TYPE) IS CURSOR C1 IS SELECT CODIGOALUMNO, NOMBREALUMNO FROM ALUMNO WHERE CICLO = P_CICLO; NCODIGOALUMNO ALUMNO.CODIGOALUMNO%TYPE; NNOMBRE ALUMNO.NOMBREALUMNO%TYPE; BEGIN OPEN C1; LOOP FETCH C1 INTO NCODIGOALUMNO, NNOMBRE; EXIT WHEN C2%NOTFOUND; UPDATE ALUMNO SET CICLO = 'VII' WHERE CODIGOALUMNO = NCODIGOALUMNO; END LOOP; CLOSE C1; END; |
2.- Declaracion de cursor con parámetros
A medida que nos complicamos, podemos declarar cursores con parámetros.
Sintaxis
La sintaxis para un cursor con parámetros en Oracle / PLSQL es:
1 2 |
CURSOR NOMBRE_CURSOR (LISTA_PARAMETRO) IS DECLARACION_SELECT; |
Ejemplo
Puede definir un cursor llamado c2 como se muestra a continuación.
1 2 3 4 5 |
CURSOR C2 (P_CICLO IN ALUMNO.CICLO%TYPE) IS SELECT CODIGOALUMNO, NOMBREALUMNO FROM ALUMNO WHERE CICLO = P_CICLO; |
El objetivo de este cursor es listar todos los alumnos de un ciclo determinado según el parámetro de ingreso
Ejemplo como utilizar un cursor con parametro.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
CREATE OR REPLACE PROCEDURE P_ACT_ALUMNO IS CURSOR C2(P_CICLO IN ALUMNO.CICLO%TYPE) IS SELECT CODIGOALUMNO, NOMBREALUMNO FROM ALUMNO WHERE CICLO = P_CICLO; NCODIGOALUMNO ALUMNO.CODIGOALUMNO%TYPE; NNOMBRE ALUMNO.NOMBREALUMNO%TYPE; BEGIN OPEN C2('VI'); LOOP FETCH C2 INTO NCODIGOALUMNO, NNOMBRE; EXIT WHEN C2%NOTFOUND; UPDATE ALUMNO SET CICLO = 'VII' WHERE CODIGOALUMNO = NCODIGOALUMNO; END LOOP; CLOSE C2; END; |
3.- Declaracion de cursor con cláusula de retorno
Finalmente, podemos declarar un cursor con una cláusula de retorno.
Sintaxis
La sintaxis para un cursor con una cláusula de retorno en Oracle / PLSQL es:
1 2 3 |
CURSOR NOMBRE_CURSOR IS DECLARACION_SELECT; VARIABLE CURSOR%ROWTYPE ; |
Por ejemplo, puede definir un cursor llamado c3 como se muestra a continuación.
1 2 3 4 5 6 |
CURSOR c3 IS SELECT * FROM ALUMNO WHERE CICLO = 'VII'; ALUMNO C3%ROWTYPE; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
CREATE OR REPLACE PROCEDURE P_ACT_ALUMNO(P_CICLO IN ALUMNO.CICLO%TYPE) IS CURSOR C3 IS SELECT CODIGOALUMNO, NOMBREALUMNO FROM ALUMNO WHERE CICLO = P_CICLO; RALUMNOS C3%ROWTYPE; BEGIN OPEN C3; LOOP FETCH C3 INTO RALUMNOS; UPDATE ALUMNO SET CICLO = 'VII' WHERE CODIGOALUMNO = RALUMNOS.CODIGOALUMNO; END LOOP; CLOSE C3; END; |
En conclusión
Es importante saber que en nuestros bloques PL/SQL los cursores son muy importantes, ya en este lenguaje el resultado de una consulta no va directamente al terminal del usuario, sino que se guarda en un área de memoria de la base de datos a la que se accede mediante los cursores nombrados.
En nuestro próximo post veremos las diferencias de un cursor implícito y explicito y el uso de LOOP FETCH Y FOR LOOP
hola feliz dia, en ese ejemplo se esta considerandom que el codigo esta dentro de un procedure o hay que llamarlo de alguna manera?
El código esta en un procedimiento.