¿Qué es CURSOR en PL / SQL?
Un cursor es un puntero a esta área de contexto. Oracle crea un área 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. Un cursor contiene las filas devueltas por la instrucción SQL. El conjunto de filas que contiene el cursor se denomina conjunto activo. Estos cursores también se pueden nombrar para que puedan ser referidos desde otro lugar del código.
En este tutorial aprenderás
- Cursor implícito
- Cursor explícito
- Atributos del cursor
- Instrucción del cursor de bucle FOR
El cursor es de dos tipos.
- 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 filas afectadas, en esa operación en particular. Estos cursores no se pueden nombrar y, por lo tanto, no se pueden controlar o hacer referencia desde otro lugar del código. Solo podemos referirnos al cursor más reciente a través de los atributos del cursor.
Cursor explícito
Los programadores pueden crear un área de contexto con nombre para ejecutar sus operaciones DML para tener más control sobre ella. El cursor explícito debe definirse en la sección 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.
- Declarando el cursor
Declarar el cursor simplemente significa crear un área de contexto con nombre para la declaración 'SELECT' que se define en la parte de declaración. El nombre de esta área de contexto es el mismo que el del cursor.
- Cursor de apertura
Abrir el cursor le indicará al PL / SQL que asigne la memoria para este cursor. Hará que el cursor esté listo para buscar los registros.
- Obteniendo datos del cursor
En este proceso, se ejecuta la instrucción 'SELECT' y las filas obtenidas se almacenan en la memoria asignada. Estos ahora se denominan conjuntos activos. La obtención de datos del cursor es una actividad a nivel de registro que significa que podemos acceder a los datos registro por registro.
Cada declaración de recuperación buscará un conjunto activo y contiene la información de ese registro en particular. Esta declaración es la misma que la declaración 'SELECT' que busca el registro y asigna a la variable en la cláusula 'INTO', pero no arrojará ninguna excepción.
- Cerrar el cursor
Una vez que se haya obtenido todo el registro ahora, debemos cerrar el cursor para que se libere la memoria asignada a esta área de contexto.
Sintaxis:
DECLARECURSORIS
- En la sintaxis anterior, la parte de declaración contiene la declaración del cursor y la variable de cursor en la que se asignarán los datos obtenidos.
- El cursor se crea para la instrucción 'SELECT' que se proporciona en la declaración del cursor.
- En la parte de ejecución, el cursor declarado se abre, se recupera y se cierra.
Atributos del cursor
Tanto el cursor implícito como el cursor explícito tienen ciertos atributos a los que se puede acceder. Estos atributos dan más información sobre las operaciones del cursor. A continuación se muestran los diferentes atributos del cursor y su uso.
Atributo de cursor | Descripción |
%ENCONTRÓ | Devuelve el resultado booleano 'VERDADERO' si la operación de búsqueda más reciente obtuvo un registro con éxito; de lo contrario, devolverá FALSO. |
%EXTRAVIADO | Esto funciona de manera opuesta a% FOUND, devolverá 'TRUE' si la operación de búsqueda más reciente no pudo obtener ningún registro. |
%ESTA ABIERTO | Devuelve el resultado booleano 'VERDADERO' si el cursor dado ya está abierto, de lo contrario, devuelve 'FALSO' |
%NÚMERO DE FILAS | Devuelve el valor numérico. Proporciona el recuento real de registros que se vieron afectados por la actividad de DML. |
Ejemplo 1 : En este ejemplo, veremos cómo declarar, abrir, recuperar y cerrar el cursor explícito.
Proyectaremos todos los nombres de los empleados de la tabla emp usando un cursor. También usaremos el atributo del cursor para configurar el bucle para recuperar todo el registro del cursor.
DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;lv_emp_name emp.emp_name%type;BEGINOPEN guru99_det;LOOPFETCH guru99_det INTO lv_emp_name;IF guru99_det%NOTFOUNDTHENEXIT;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:BBBEmployee Fetched:XXXEmployee Fetched:YYYTotal rows fetched is 3
Explicación del código:
- Línea de código 2 : Declarando el cursor guru99_det para la instrucción 'SELECT emp_name FROM emp'.
- Línea de código 3 : Declaración de variable lv_emp_name.
- Línea de código 5 : Abriendo el cursor guru99_det.
- Línea de código 6: Configuración de la instrucción de bucle básico para recuperar 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: uso del atributo de cursor '% NOTFOUND' para encontrar si se recupera todo el registro del cursor. Si se recupera, devolverá 'TRUE' y el control saldrá del bucle; de lo contrario, el control seguirá obteniendo los datos del cursor e imprimirá los datos.
- Línea de código 11: condición EXIT para la declaración de bucle.
- Línea de código 12: Imprima el nombre del empleado obtenido.
- Línea de código 14: uso del atributo del cursor '% ROWCOUNT' para encontrar el número total de registros que se vieron afectados / recuperados en el cursor.
- Línea de código 15: Después de salir del bucle, el cursor se cierra y la memoria asignada se libera.
Instrucción del cursor de bucle FOR
La sentencia "FOR LOOP" se puede utilizar para trabajar con cursores. Podemos dar el nombre del cursor en lugar del 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. La variable del cursor, la apertura del cursor, la obtención y el cierre del cursor se realizarán implícitamente mediante el bucle FOR.
Sintaxis:
DECLARECURSORIS
- En la sintaxis anterior, la parte de declaración contiene la declaración del cursor.
- El cursor se crea para la instrucción 'SELECT' que se proporciona en la declaración del cursor.
- En la parte de ejecución, el cursor declarado se configura en el bucle FOR y la variable de bucle 'I' se comportará como variable de cursor en este caso.
Ejemplo 1 : En este ejemplo, proyectaremos todo el nombre de empleado de la tabla emp usando un ciclo de cursor-FOR.
DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;BEGINFOR lv_emp_name IN guru99_detLOOPDbms_output.put_line(‘Employee Fetched:‘||lv_emp_name.emp_name);END LOOP;END;/
Producción
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYY
Explicación del código:
- Línea de código 2 : Declarando el cursor guru99_det para la instrucción 'SELECT emp_name FROM emp'.
- Línea de código 4 : Construcción del bucle 'FOR' para el cursor con la variable de bucle lv_emp_name.
- Línea de código 5: Imprimir el nombre del empleado en cada iteración del ciclo.
- Línea de código 8: Salir del bucle
Nota: En el bucle Cursor-FOR, los atributos del cursor no se pueden usar ya que la apertura, extracción y cierre del cursor se realiza implícitamente mediante el bucle FOR.