¿Qué es CURSOR en PL / SQL?
El cursor es un puntero en este campo de contexto. Oracle crea un campo de contexto para procesar una declaración SQL que contiene toda la información sobre la declaración.
PL / SQL permite al programador controlar el área de contexto a través del cursor. El cursor mantiene las filas devueltas en la instrucción SQL. La matriz de cursores se denomina conjunto activo. Estos cursores también se pueden nombrar para que se puedan transmitir desde otro lugar del código.
En este tutorial aprenderás
Hay dos tipos de cursor.
- Cursor implícito
- Cursor explícito
Cursor implícito
Siempre que ocurra alguna operación DML en la base de datos, se crea un cursor implícito que contiene las capas relevantes, en esa operación en particular. Estos cursores no se pueden nombrar y por lo tanto no se pueden controlar o transmitir desde otra parte del código. Solo podemos referirnos al último cursor a través de los atributos del cursor.
Cursor explícito
Los programadores pueden crear un área de contexto designada para realizar sus operaciones DML para un mayor control. El cursor explícito debe definirse en la parte de declaración del bloque PL / SQL, y se crea para la declaración ‘SELECT’ que debe usarse en el código.
A continuación se muestran los pasos necesarios para trabajar con cursores explícitos.
- Recuperar datos del cursor
En este proceso, se ejecuta la instrucción ‘SELECT’ y las filas resultantes se almacenan en la memoria asignada. Estos ahora se denominan conjuntos activos. Recuperar datos del cursor es una actividad a nivel de registro, lo que significa que podemos acceder a los datos de forma grabada.
Cada declaración de nacimiento recibirá un conjunto activo y conservará la información de ese registro en particular. Esta declaración es la misma que la instrucción ‘SELECT’ que recibe el registro y lo asigna a la variable en la cláusula ‘INTO’, pero no necesita ser una excepción.
Sintaxis:
DECLARE CURSOR <cursor_name> IS <SELECT statement^> <cursor_variable declaration> BEGIN OPEN <cursor_name>; FETCH <cursor_name> INTO <cursor_variable>; . . CLOSE <cursor_name>; END;
- En la sintaxis anterior, la parte de declaración contiene la declaración del cursor y la variable del cursor en la que se asignan los datos.
- El cursor se crea para la instrucción ‘SELECT’ dada en la declaración del cursor.
- En la sección de ejecución, el cursor de confirmación se abre, se recibe y se cierra.
Atributos del cursor
Un cursor implícito y el cursor explícito tienen ciertos atributos a los que se puede acceder. Estos atributos proporcionan más información sobre las operaciones del cursor. A continuación se muestran los distintos atributos del cursor y su uso.
Atributo de cursor | Suelte |
% ENCONTRÓ | Devuelve el resultado booleano ‘VERDADERO’ si la última operación de hervido obtuvo un registro con éxito, o devuelve FALSO. |
% DARSE CUENTA | Esto funciona en contraste con% FOUND, devolverá ‘TRUE’ si la última operación de recuperación no pudo obtener ningún registro. |
% ESTA ABIERTO | Devuelve el resultado booleano ‘VERDADERO’ si el cursor dado ya está abierto, o devuelve ‘FALSO’ |
% NÚMERO DE FILAS | Devuelve el valor numérico. Proporciona el recuento real de registros afectados por la actividad de DML. |
Ejemplo 1: En este ejemplo, veremos cómo declarar, abrir, recuperar y cerrar el cursor explícito.
Proyectaremos el nombre de todo el empleado de la tabla emp usando un cursor. También usaremos un atributo de cursor para configurar el bucle para obtener todo el registro del cursor.
DECLARE CURSOR guru99_det IS SELECT emp_name FROM emp; lv_emp_name emp.emp_name%type; BEGIN OPEN guru99_det; LOOP FETCH guru99_det INTO lv_emp_name; IF guru99_det%NOTFOUND THEN EXIT; END IF; Dbms_output.put_line(‘Employee Fetched:‘||lv_emp_name); END LOOP; Dbms_output.put_line(‘Total rows fetched is‘||guru99_det%R0WCOUNT); CLOSE guru99_det; END: /
Producción
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY Total rows fetched is 3
Explicación del Código:
- Línea de código 2: Declarando el cursor guru99_det para las declaraciones ‘SELECT emp_name FROM emp’.
- Línea de código 3: Declaración de variable lv_emp_name.
- Línea de código 5: Abre el cursor guru99_det.
- Línea de código 6: Establezca la declaración de bucle básica para obtener todos los registros en la tabla ‘emp’.
- Línea de código 7: Obtiene los datos de guru99_det y asigna el valor a lv_emp_name.
- Línea de código 9: Usando el atributo de cursor ‘% NOTFOUND’ para determinar si todos los registros se encuentran en el cursor. Si se encuentra, devolverá ‘TRUE’ y el control saldrá del bucle, o el control continuará recuperando los datos del cursor e imprimiendo los datos.
- Línea de código 11: Condición EXIT para la instrucción de bucle.
- Línea de código 12: Imprime el nombre del empleado buscado.
- Línea de código 14: Usando el atributo de cursor ‘% ROWCOUNT’ para obtener el número total de registros que afectaron al cursor.
- Línea de código 15: Después de salir del bucle, el cursor se cierra y la memoria asignada queda libre.
PARA la instrucción Loop Cursor
La instrucción «FOR LOOP» se puede utilizar para trabajar con cursores. Podemos sustituir el nombre del cursor por un límite de rango en la instrucción del ciclo FOR para que el ciclo funcione desde el primer registro del cursor hasta el último registro del cursor. El bucle FOR implícitamente el cursor, abrirá el cursor, cerrará el cursor y cerrará el cursor.
Sintaxis:
DECLARE CURSOR <cursor_name> IS <SELECT statement>; BEGIN FOR I IN <cursor_name> LOOP . . END LOOP; END;
- En la sintaxis anterior, la parte de declaración contiene la declaración del cursor.
- El cursor se crea para la instrucción ‘SELECT’ dada en la declaración del cursor.
- En la parte de ejecución, el cursor declarado se establece en el bucle FOR y, en este caso, la variable llevará el bucle ‘I’ como variable de cursor.
Ejemplo 1: En este ejemplo, usaremos el nombre de todos los empleados de la tabla emp usando el bucle cursor-FOR.
DECLARE CURSOR guru99_det IS SELECT emp_name FROM emp; BEGIN FOR lv_emp_name IN guru99_det LOOP Dbms_output.put_line(‘Employee Fetched:‘||lv_emp_name.emp_name); END LOOP; END; /
Producción
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY
Explicación del Código:
- Línea de código 2: Declarando el cursor guru99_det para las declaraciones ‘SELECT emp_name FROM emp’.
- Línea de código 4: Construyendo el ciclo ‘FOR’ para el cursor con la variable de ciclo lv_emp_name.
- Línea de código 5: Imprime el nombre del empleado en cada versión del ciclo.
- Línea de código 8: Salir del bucle
Nota: En el ciclo Cursor-FOR, los atributos del cursor no se pueden usar ya que el ciclo FOR abre, recupera y cierra implícitamente los cursores.