¿Cuándo se debe utilizar el Ciclo LOOP en los Packages en Oracle?

Aprender a decidir cuando se debe utilizar le ciclo LOOP es una técnica muy importante para poder desarrollar procesos en Oracle que sean eficientes al momento de manipular los datos y para que se puedan aplicar criterios y validaciones a una gran cantidad de datos.

El ciclo LOOP te permite repetir un mismo proceso más de una vez de forma controlada, a diferencia del ciclo FOR y WHILE el LOOP no tiene una condición de término del ciclo que sea explicita, para terminar el ciclo LOOP se debe utilizar el comando EXIT. Para entenderlo mejor revisemos un ejemplo práctico.

Ejemplo #1: Supongamos que se necesita ejecutar una consulta a la Base de Datos de Oracle 3 veces pero en cada consulta lo único que cambia es el valor del parámetro de búsqueda:

Primera Forma Sin Ciclo Loop:

/* Procedures en Oracle */

Procedure Prc_Sin_Ciclo_Loop(pin_rut in number) Is

lst_nombre varchar2(20);

lin_edad number;

lst_error varchar2(100);

Begin

Select Emp.Nombre, Emp.Edad Into lst_Nombre, lin_Edad From T_Empleado Emp

Where Emp.Rut = p_Rut And Emp.Id_Departamento = 1;

If lin_Edad > 40 Then

… Procesar datos del empleado…

End if;

Select Emp.Nombre, Emp.Edad Into lst_Nombre, lin_Edad From T_Empleados Emp

Where Emp.Rut = p_Rut And Emp.Id_Departamento = 2;

If lin_Edad > 40 Then

… Procesar datos del empleado…

End if;

Select Emp.Nombre, Emp.Edad Into lst_Nombre, lin_Edad From T_Empleados Emp

Where Emp.Rut = p_Rut And Emp.Id_Departamento = 3;

If lin_Edad > 40 Then

… Procesar datos del empleado…

End if;

Exception

When No_Data_Found Then

lst_error:= ‘error: no se encontraron datos’;

End Prc_Sin_Ciclo_Loop;

En esta primera forma se ha repetido tres veces la misma consulta a la Base de Datos donde solo se cambia el código del id_departamento, lo que resulta ser un código poco eficiente ya que si se debe hacer algún cambio este se debe realizar tres veces. Para evitar tener que duplicar código se debe utilizar el ciclo LOOP.

TÚ REPORTE: “Cómo Construir un SELECT Eficiente en ORACLE en Solo 7 Pasos”  ¡ Haz Click Aquí y Descárgalo GRATIS Ahora !

Segunda Forma Con Ciclo Loop:

/* Procedures en Oracle */

Procedure Prc_Con_Ciclo_Loop(pin_rut in number) Is

lst_nombre varchar2(20);

lin_edad number;

lst_error varchar2(100);

Begin

lin_Id_Departamento:= 1;

Loop

Select Emp.Nombre, Emp.Edad Into lst_Nombre, lin_Edad From T_Empleado

Emp Where Emp.Rut = pin_Rut And Emp.Id_Departamento =

lin_Id_Departamento;

If lin_Edad > 40 Then

… Procesar datos del empleado…

End if;

if lin_Id_Departamento = 3 Then

Exit;

End if;

lin_Id_Departamento := lin_Id_Departamento + 1;

End Loop;

Exception

When No_Data_Found Then

lst_error:= ‘error: no se encontraron datos’;

End Prc_Con_Ciclo_Loop;

En este ejemplo se hacen 3 consultas a la Base de Datos pero en vez de repetir tres veces el Select se encapsula todo dentro de un ciclo LOOP que resulta mucho más eficiente. Nota que la variable lin_Id_Departamento se inicia con el valor 1 y luego se incrementa hasta llegar al valor 3 para que el ciclo termine con la sentencia EXIT.

Estoy muy interesado en conocer tu opinión y/o comentario sobre este artículo, también cuéntame sobre qué es lo que quieres saber de Packages en Oracle y/o dime cuál es tu principal frustración a la hora de trabajar con Packages en Oracle. Estaré muy atento respondiendo tus preguntas y/o comentarios, gracias.

Saludos

Roberto Vicencio – Escritor del Reporte:

Cómo Construir un SELECT Eficiente en ORACLE en 7 Pasos

Esta entrada fue publicada en Function en Oracle, Packages en Oracle, Procedures en Oracle y etiquetada , , , , , . Guarda el enlace permanente.

2 respuestas a ¿Cuándo se debe utilizar el Ciclo LOOP en los Packages en Oracle?

  1. nestor gomez dijo:

    buenas tardes me parece interesante el comentario, en este momento estoy tratando de sacar una consulta que une varias tablas, el resultado que busco es que me saque dos registros en un campo de fecha, uno que es null o abierto y el otro que tiene fecha o cerrado, la consulta me devuelve todos, abiertos y cerrados en eso ando llevo ya una seman pero ahi vamos si puede colaborar agradeceria mucho

    • Hola Nestor, gracias por tu comentario, respecto de tu consulta te agradeceria si agregas mas detalles como un ejemplo de los datos y la query que estas haciendo, ya que no esta muy claro como son los datos del origen y lo que queres obtener de ellos, pero si entiendo bien solo quieres obtener 2 registros y si tus datos contienen todos la misma fecha o un null basta con que hagas un GROUP BY por el campo de fecha que tienes para obtener los dos registros, pero si tienes fechas distintas esta solución no te servirá porque vas a obtener un registro por cada fecha diferente que tengas. Envíame mas información para ayudarte mejor.

      Saludos
      Roberto Vicencio.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s