Saltar al contenido

Sepa Como Utilizar el Ciclo FOR en los PL-SQL Packages en Oracle

PL-SQL Packages en OracleSi aprendes como usar correctamente el ciclo FOR podrás iterar o repetir procesos las veces que lo estimes conveniente dentro de tus PL-SQL Packages en Oracle.

En el bucle o ciclo FOR el número de iteraciones se conoce antes de que comience a ejecutarse el bucle en tus PL-SQL Packages en Oracle. El ciclo FOR itera sobre una serie determinada de números enteros los que son definidos con anterioridad.

El rango de ejecución de un ciclo FOR es parte de un esquema de iteración el cual está encerrado por las palabras claves FOR y LOOP. Revisemos a continuación como es la sintaxis del bucle FOR en los PL-SQL Packages en Oracle:

/* PL-SQL Packages en Oracle */

FOR contador IN [REVERSE] limite_inferior..limite_superior LOOP

secuencia_de_estamentos;

END LOOP;

Donde:

FOR= Permite identificar el inicio del bucle de iteraciones en tus PL-SQL Packages en Oracle.

Contador= Variable de tipo numérica que es local dentro del bucle FOR, la que se incrementa según las iteraciones definidas por las constantes limite_inferior y limite_superior.

IN= Permite identificar el rango de iteraciones que ejecutará el bucle FOR en tus PL-SQL Packages en Oracle.

REVERSE= Permite ejecutar el bucle FOR de forma descendente, por defecto se ejecuta de forma ascendente.

TÚ REPORTE: “Cómo Construir un SELECT Eficiente en ORACLE en Solo 7 Pasos”

¡ Haz Click Aquí y Descárgalo GRATIS Ahora !

Limite_inferior= Permite definir el valor inicial donde comenzará a ejecutarse el bucle FOR.

Limite_superior= Permite definir el valor final donde terminará la ejecución del bucle FOR.

LOOP= Indica el comienzo del bucle que se iterará o repetirá según el rango definido en la cláusula IN.

Secuencia_de_estamentos= Corresponde a los estamentos que se ejecutarán dentro del ciclo FOR, los que se repetirán según las veces que están definidas en la cláusula IN.

END LOOP= Indica el final del bucle del ciclo FOR dentro de tus PL-SQL Packages en Oracle.

Ejemplo #1: Supone que deseas ejecutar 3 veces un bloque de código o secuencias de estamentos, veamos como se hace:

/* PL-SQL Packages en Oracle */

FOR i IN 1..3 LOOP

Secuencia_de_estamentos;

END LOOP;

En este ejemplo a la variable i se le asignan los valores 1,2 y 3, y la secuencia_de_estamentos se ejecuta 3 veces en tus PL-SQL Packages en Oracle.

Te propongo que pruebes de inmediato estos ejemplos en tu Base de Datos con tus propias tablas,  PL-SQL Procedures en Oracle y PL-SQL Function en Oracle, para que comiences a ejercitar la mano y aprendas a dominar esta nueva técnica en tus PL-SQL Packages en Oracle.

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 PL-SQL Packages en Oracle y/o dime cuál es tu principal frustración a la hora de trabajar con PL-SQL 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 Solo 7 Pasos

13 comentarios en «Sepa Como Utilizar el Ciclo FOR en los PL-SQL Packages en Oracle»

  1. Saludos desde Ecuador, tengo una pregunta, que tan eficiente es hacer un select dentro de un FOR Ej:

    FOR REC IN (SELECT KS.NUT,
    KS.NUMAFI CEDULA
    KS.CODTIPSOLSER,
    KS.CODESTSOLSER
    KS.NUMSOLSER
    KS.FECSOL
    FROM KSCRETSOLICITUDES KS
    WHERE KS.CODESTSOLSER NOT IN (‘GAP’,’GAC’,’REC’)
    AND (KS.CODTIPSOLSER,KS.NUMSOLSER) IN (SELECT PR.CODTIPSOLSER, PR.NUMSOLSER
    FROM CRE_PROCESOSREALIZADOS_TBL PR
    WHERE CODESTPRO=10)

    AND TO_DATE(KS.FECSOL,’DD/MM/RRRR’) BETWEEN TO_DATE(’01/03/2013′,’DD/MM/RRRR’) AND
    TO_DATE(’31/03/2013′,’DD/MM/RRRR’)

    ORDER BY KS.NUT,KS.FECSOL
    ) LOOP

    Que tan óptimo es hacer esto?

    1. Hola Eduardo, gracias por comunicarte, un Select es eficiente si esta bien construido y daría lo mismo si lo colocas solo, en un For o en un Cursor, el Select que hiciste a simple vista tiene algunas falencias, por ejemplo, en vez de usar un IN a la tabla CRE_PROCESOSREALIZADOS_TBL usa un Join, el campo FECSOL lo transformas a fecha siendo que deberías dejar el rango de fechas como texto ademas debería tener un índice, espero haberte ayudado, gracias.

      Saludos
      Roberto Vicencio – Para Tu Éxito con Oracle.

    1. Hola Juan, gracias por comunicarte, claro que se puede hacer una prueba de estrés con el ciclo For en un procedimiento, tu defines la cantidad de veces que se repetirá el proceso que puede ser 100, 1000, 10000, etc., gracias.

      PD: Ya obtuviste mi libro-reporte sobre “Como Construir un SELECT Eficiente en Oracle en Solo 7 Pasos”, si aun no lo tienes puedes obtenerlo desde el enlace https://dominatuspackagesen0racle.com/.

      Saludos
      Roberto Vicencio – Para Tu Éxito con Oracle.

  2. tengo un for dentro de otro for el primero o el for papa traer un numero de id una sola vez y ese id se lo envio a el for hijo el cual es el que esta dentro del for principal, el for que esta adentro recorre un cursor con ese dato, pero en ese cursor esta varias veces, pero el insert me lo realiza una sola vez y lo deberia realizar tanta veces este el dato…

    1. Hola Javier, gracias por comunicarte, si me indicas que el segundo for recorre un cursor que debe traer varias filas pero que realiza solo un insert, primero debes tomar la query del cursor y ejecutarla aparte para asegurarte que realmente trae varias filas, de lo contrario nose que otro problema puede haber ya que no pegaste el código, gracias.

      PD: Ya pudiste ver mi libro-reporte sobre ‘Cómo Crear un SELECT Eficiente en ORACLE en Solo 7 Pasos’, si aun no lo tienes en tus manos puedes obtenerlo desde aquí https://dominatuspackagesen0racle.com/

      Saludos
      Roberto Vicencio – Para Tu Éxito con Oracle

  3. Hola. Tengo una pregunta con relación a las iteracion y conjuntos de registros. Tengo dos tablas tb1 y tb2. Quiero recorrer la primera y agrupar por registros que coinciden en n campos y actualizar sobre la segunda, está se hará respectivamente, es decir; registro 1 del primer conjunto de la tb1 actualizará la primera coincidencia con la tb2. No se si me hice explicar. Pero algo así es lo que tengo por problema.
    Saludos.

    1. Hola Alfonso, gracias por comunicarte, lo que debes hacer es usar un cursor para agrupar la tabla tb1, luego usar un ciclo para leer el cursor y actualizar la tabla tb2, te recomiendo ver el siguiente enlace para entender mas:

      https://dominatuspackagesen0racle.com/no-dupliques-codigo-en-tus-packages-en-oracle-usa-un-ciclo-for.html

      PD: Si te ha gustado lo que has visto del blog te invito a compartir el enlace https://dominatuspackagesen0racle.com/ con tus amigos o personas que también les pueda interesar ver esta información, gracias.

      Saludos
      Roberto Vicencio – Para Tu Éxito con Oracle.

  4. Tengo el siguiente ejemplo pero me da error la parte del continue.

    DECLARE
    montoPrincipal NUMBER (18, 2) := 100;
    cantidad NUMBER (10) := 3;
    cociente NUMBER (18);
    montoSaldo NUMBER (18, 2) := 0;
    montoPendiente NUMBER (18, 2);
    BEGIN
    cociente := ROUND (montoPrincipal / cantidad);
    DBMS_OUTPUT.PUT_LINE (cociente);

    FOR i IN 1 .. cantidad
    LOOP
    montoSaldo := montoSaldo + cociente;
    montoPendiente := montoPrincipal – montoSaldo;

    IF (montoPendiente >= montoSaldo)
    THEN
    CONTINUE;
    END IF;

    DBMS_OUTPUT.PUT_LINE (‘ SALDO:’ || cociente);
    END LOOP;

    IF (montoPendiente > 0)
    THEN
    DBMS_OUTPUT.PUT_LINE (‘ULTIMO SALDO:’ || montoPendiente+i);
    END IF;
    END;

    Podrían ayudarme??

    1. Hola Miguel, gracias por comunicarte, el comando Continue funciona desde Oracle 11g en adelante, ejecute tu script y el único error que hay esta en la linea DBMS_OUTPUT.PUT_LINE(‘ULTIMO SALDO:’||montoPendiente+i); porque estas usando la variable i que no existe porque esta fuera del for, cambie la linea por DBMS_OUTPUT.PUT_LINE(‘ULTIMO SALDO:’||montoPendiente); y entrego este resultado:
      33
      SALDO:33
      SALDO:33
      ULTIMO SALDO:1

      PD: Ya viste mi libro-reporte sobre “Cómo Crear un SELECT Eficiente en ORACLE en Solo 7 Pasos”, si aun no lo tienes en tus manos puedes obtenerlo gratis desde aquí: https://dominatuspackagesen0racle.com/

      Saludos
      Roberto Vicencio – Para Tu Éxito con Oracle.

  5. Saludos Roberto, de antemano mil gracias por la información, esta muy completa.
    Quiero pedirte ayuda con lo siguiente, haber si me das una luz, la verdad soy nuevo y me estoy iniciando en Oracle.
    Mi pregunta es la siguiente, puedo con un FOR recorrer un campo de fechas y en función del mes ejecutar una “Secuencia_de_estamentos”, es decir que primero recorra todo Enero y ejecute un UPDATE, luego recorra todo febrero y ejecute el mismo UPDATE y así sucesivamente hasta Diciembre, el campo de fecha esta en formato DD/MM/YYYY, agradezco mucho si me puedes dar alguna guía que me ayude a orientarme un poco.

  6. Hola tengo un for con fechas para insertar información en varias tablas de acuerdo a un rango de fechas (date_ini .. Date_end) tengo problemas cuando es cambio de mes si squiero insertar información de algunos días ejemplo date_ini (20200830)y otros de date_end (20200906)), cuando el for va a tomar la siguiente fecha despues de 20200831 no toma la fecha de 20200901 sino que toma 20200832. Me puedes indicar si alguna forma de evitar este error
    —————–LLENADO DE TABLAS ———————-
    FOR c_dias in date_ini .. date_fin loop
    v_dia := to_char(c_dias);

    dbms_output.put_line(‘dia: ‘ || v_dia);

    1. Hola Jessica, gracias por comunicarte, en el ciclo For no puedes usar fechas como rango, puedes usar números o letras, para estos casos lo mas recomendable es usar el For con la cantidad de días a trabajar y luego se incrementa la fecha como en el siguiente ejemplo:

      declare
      lin_cant_dias number;
      ldt_date_ini date;
      ldt_date date;
      begin
      lin_cant_dias:= 8;
      ldt_date_ini:= to_date(‘20200830′,’yyyymmdd’);
      For lin_dia In 0..lin_cant_dias Loop
      ldt_date:= ldt_date_ini + lin_dia;
      dbms_output.put_line(‘dia: ‘ || to_char(ldt_date,’yyyymmdd’));
      end loop;
      end;
      /

      PD: Si te ha gustado lo que has visto del blog y quieres saber mucho mas, te invito a ver el siguiente Webinar en vivo:
      https://dominatuspackagesen0racle.com/wbplsqlnew

      Saludos
      Roberto Vicencio – Para Tu Éxito con Oracle.

Deja una respuesta

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.