Oracle Cursor PL/SQL: implícito, explícito, bucle For con ejemplo
¿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 declaración SQL. El conjunto de filas que contiene el cursor se denomina conjunto activo. Estos cursores también se pueden nombrar para poder hacer referencia a ellos desde otro lugar del código.
El cursor es de dos tipos.
- Cursores implícitos
- Cursor explícito
Cursores implícitos
Siempre que se produce 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 ni hacer referencia a ellos desde otro lugar del código. Solo podemos hacer referencia 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 y así tener más control sobre ella. El cursor explícito debe definirse en la sección de declaración de la Bloque PL / SQLy se crea para la declaración 'SELECT' que debe usarse en el código.
A continuación se detallan 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 nombre del cursor.
- Cursor de aperturaAl abrir el cursor se le indicará al PL / SQL para asignar la memoria para este cursor. Esto preparará el cursor para buscar los registros.
- Obteniendo datos del cursorEn este proceso, se ejecuta la instrucción 'SELECT' y las filas recuperadas se almacenan en la memoria asignada. Estos ahora se denominan conjuntos activos. Obtener datos del cursor es una actividad a nivel de registro, lo que significa que podemos acceder a los datos registro por registro. Cada declaración de recuperación buscará un conjunto activo y mantendrá la información de ese registro en particular. Esta declaración es la misma que la declaración "SELECT" que recupera el registro y lo asigna a la variable en la cláusula "INTO", pero no generará ninguna excepción.
- Cerrar el cursorUna vez que se han obtenido todos los registros, debemos cerrar el cursor para que se libere la memoria asignada a esta área de contexto.
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 asignarán los datos recuperados.
- El cursor se crea para la declaració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 explícito tienen ciertos atributos a los que se puede acceder. Estos atributos brindan más información sobre las operaciones del cursor. A continuación, se muestran los diferentes atributos del cursor y su uso.
Atributo del 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; en caso 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 DML. |
Ejemplo de cursor explícito:
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 de cursor para configurar el bucle para recuperar todos los registros 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: /
Salida
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: Declarar el cursor guru99_det para la declaración 'SELECT emp_name FROM emp'.
- Línea de código 3: Declarando la variable lv_emp_name.
- Línea de código 5: Abriendo el cursor guru99_det.
- Línea de código 6: Configurar 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: Usando el atributo de cursor '%NOTFOUND' para encontrar si se recupera todo el registro en el cursor. Si se recupera, devolverá "VERDADERO" y el control saldrá del bucle; de lo contrario, el control seguirá recuperando los datos del cursor y los imprimirá.
- Línea de código 11: Condición de SALIDA para la declaración de bucle.
- Línea de código 12: Imprima el nombre del empleado recuperado.
- Línea de código 14: Usando el atributo de cursor '%ROWCOUNT' para encontrar el número total de registros que fueron 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.
FOR instrucción del cursor de bucle
La instrucción “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 bucle FOR para que el bucle funcione desde el primer registro del cursor hasta el último registro del cursor. La variable del cursor, la apertura del cursor, la recuperación y el cierre del cursor se realizarán implícitamente mediante el bucle FOR.
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 declaració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 del bucle 'I' se comportará como variable de cursor en este caso.
Oracle Ejemplo de cursor para bucle:
En este ejemplo, proyectaremos todos los nombres de los empleados de la tabla emp usando un bucle de 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; /
Salida
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY
Explicación del código
- Línea de código 2: Declarar el cursor guru99_det para la declaración 'SELECT emp_name FROM emp'.
- Línea de código 4: Construyendo el 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 bucle.
- 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, recuperación y cierre del cursor se realiza implícitamente mediante En bucle.