Saltar al contenido

¿Por qué utilizar cursores explícitos en lugar de bucles regulares?

Carmen, miembro de este equipo, nos hizo el favor de escribir este tutorial ya que conoce perfectamente el tema.

Solución:

El código que publicaste usa un cursor. Está utilizando un bucle de cursor implícito.

Hay casos en los que el uso de un bucle de cursor explícito (es decir, declarar una variable CURSOR en la sección de declaración) produce un código más limpio o un mejor rendimiento

  1. Si tiene consultas más complejas que no puede refactorizar en vistas, puede hacer que el código sea más fácil de leer si su ciclo se repite student_cursor en lugar de incluir una declaración SQL de 30 líneas que incorpora mucha lógica. Por ejemplo, si estuviera imprimiendo todos los estudiantes que fueron autorizados para graduarse y eso implicó unirse a tablas que tenían sus registros académicos, los requisitos de su programa de grado, tablas con información sobre reservas académicas, tablas con información sobre libros de biblioteca vencidos, tablas con información sobre tarifas impagas, anulaciones administrativas, etc., probablemente tendría sentido refactorizar el código para que esta consulta no se atasque en el medio del código que se ocupa de presentar la lista a un usuario. Eso podría implicar la creación de una vista que encapsule toda esta lógica. O podría implicar la creación de un cursor explícito que se declaró como parte del bloque PL / SQL actual o en algún bloque PL / SQL de nivel superior (es decir, un cursor declarado en un paquete) para que sea reutilizable. O podría implicar hacer algo más para encapsular y reutilizar (por ejemplo, crear una función de tabla canalizada en su lugar).
  2. Si desea hacer uso de operaciones masivas en PL / SQL, generalmente desea usar cursores explícitos. Aquí hay un hilo de StackOverflow que analiza las diferencias de rendimiento entre cursores explícitos e implícitos. Si todo lo que haces es llamar htp.prn, haciendo un BULK COLLECT probablemente no te compre nada. En otros casos, sin embargo, puede resultar en mejoras sustanciales del rendimiento.

Un cursor puede ser explícito o implícito, y cualquier tipo se puede utilizar en un bucle FOR. En realidad, hay dos aspectos de tu pregunta.

  1. ¿Por qué utilizar un ciclo FOR de cursor explícito sobre un ciclo FOR de cursor implícito?

    • Utilice un ciclo FOR de cursor explícito cuando se reutilice la consulta; de lo contrario, se prefiere un cursor implícito.
  2. ¿Por qué usar un bucle con un FETCH en lugar de un bucle FOR que no tiene un FETCH explícito?

    • Utilice un FETCH dentro de un bucle cuando necesite realizar una recopilación masiva o cuando necesite SQL dinámico.

Aquí hay información útil de la documentación.

Ejemplo de cursor implícito FOR LOOP

BEGIN
   FOR vItems IN (
      SELECT last_name
      FROM employees
      WHERE manager_id > 120
      ORDER BY last_name
   ) 
   LOOP
      DBMS_OUTPUT.PUT_LINE ('Name = ' || vItems.last_name);
   END LOOP;
END;
/

Ejemplo de cursor explícito FOR LOOP

DECLARE
   CURSOR c1 IS
      SELECT last_name
      FROM employees
      WHERE manager_id > 120
      ORDER BY last_name;
BEGIN
   FOR vItems IN c1 LOOP
      DBMS_OUTPUT.PUT_LINE ('Name = ' || vItems.last_name);
   END LOOP;
END;
/

Cursor implícito

Un cursor implícito es un cursor de sesión construido y administrado por PL / SQL. PL / SQL abre un cursor implícito cada vez que ejecuta una instrucción SELECT o DML. No puede controlar un cursor implícito, pero puede obtener información de su attributes.

Un cursor implícito se cierra después de que se ejecuta su instrucción asociada; sin embargo, es attribute los valores permanecen disponibles hasta que se ejecuta otra instrucción SELECT o DML.

El cursor implícito attributes son: SQL% ISOPEN, SQL% FOUND, SQL% NOTFOUND, SQL% ROWCOUNT, SQL% BULK_ROWCOUNT, SQL% BULK_EXCEPTIONS

Cursor explícito

Un cursor explícito es un cursor de sesión que usted construye y administra. Debe declarar y definir un cursor explícito, dándole un nombre y asociándolo con una consulta (normalmente, la consulta devuelve varias filas). Luego, puede procesar el conjunto de resultados de la consulta de cualquiera de estas formas:

Abra el cursor explícito (con la instrucción OPEN), obtenga filas del conjunto de resultados (con la instrucción FETCH) y cierre el cursor explícito (con la instrucción CLOSE).

Utilice el cursor explícito en una sentencia FOR LOOP de cursor (consulte “Procesamiento de conjunto de resultados de consulta con sentencias FOR LOOP del cursor”).

No puede asignar un valor a un cursor explícito, usarlo en una expresión o usarlo como un parámetro de subprograma formal o una variable del lenguaje principal. Puede hacer esas cosas con una variable de cursor (consulte “Variables de cursor”).

A diferencia de un cursor implícito, puede hacer referencia a un cursor explícito o una variable de cursor por su nombre. Por lo tanto, un cursor explícito o una variable de cursor se denomina cursor con nombre.

Cursor FOR LOOP Sentencias

La instrucción del cursor FOR LOOP le permite ejecutar una instrucción SELECT y luego recorrer inmediatamente las filas del conjunto de resultados. Esta declaración puede utilizar un cursor implícito o explícito.

Veo que muchos desarrolladores están usando cursores explícitos en lugar de cursores implícitos por costumbre. Esto se debe a que en la versión 7 de Oracle, esta era siempre la forma más eficiente de hacerlo. Hoy en día generalmente existen al revés. Especialmente con el optimizador que, si es necesario, puede reescribir el cursor implícito para bucles en una recopilación masiva.

Recuerda algo, que tienes la capacidad de valorar esta sección si tropezaste tu enigma a tiempo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *