Saltar al contenido

No Dupliques Código en Tus PL-SQL Packages en Oracle, Usa un Ciclo FOR

PL-SQL Packages en OracleMuchas veces cuando estas escribiendo código en tus PL-SQL Packages en Oracle, tiendes a repetir o duplicar una rutina de código porque debes aplicarla para más de un caso a la vez. Esta táctica no es recomendable porque al final resulta ser muy peligrosa si el código sigue creciendo y no se mantiene correctamente.

Este método es peligroso porque si repites varias veces un trozo de código fuente en tus PL-SQL Packages en Oracle,  donde solo cambian un par de parámetros y el resto del código se mantiene igual, cuando debas realizar alguna modificación que afecta a cada código repetido, te olvidarás de aplicar el cambio en todos las partes, lo que producirá problemas en la ejecución de los procesos y el código fuente se volverá engorroso, ilegible e inmantenible en tus PL-SQL Packages en Oracle.

Para solucionar este problema debes utilizar el ciclo FOR, que permite básicamente ejecutar un mismo trozo de código mas de una vez de forma controlada, es decir, que puedes programar un ciclo FOR para que se repita las veces que sea necesario. Para entender mejor esta problemática veamos algunos ejemplos en PL-SQL Packages en Oracle que sean prácticos.

Ejemplo #1: Supone que debes contar los empleados que se encuentran en 3 estados civiles diferentes, veamos la forma errónea y luego la forma correcta:

Forma errónea:

/* PL-SQL Packages en Oracle */

Select count(1) Into lin_cant_emp From t_empleado Where id_estado_civil = 1; – 1= Soleto

If lin_cant_emp > 50 then

— procesar empleados

End if;

Select count(1) Into lin_cant_emp From t_empleado Where id_estado_civil = 2; – 2= Casado

If lin_cant_emp > 50 then

— procesar empleados

End if;

Select count(1) Into lin_cant_emp From t_empleado Where id_estado_civil = 3; – 3= Separado

If lin_cant_emp > 50 then

— procesar empleados

End if;

Muchos desarrolladores tienden a realizar esto que esta erróneo. En este ejemplo se esta repitiendo el código 3 veces para contar los empleados por cada estado civil diferente, lo único que cambia es el ID del estado civil y el resto del código se mantiene. Si debes realizar un cambio debes tener la precaución de hacerlo en las tres partes repetidas en tus PL-SQL Packages en Oracle.

Forma correcta:

/* PL-SQL Packages en Oracle */

For lin_Id_Estado_Civil In 1..3 Loop

Select count(1) Into lin_cant_emp From t_empleado

Where id_estado_civil = lin_id_estado_civil

If lin_cant_emp > 50 then

— procesar empleados

End if;

End loop;

En este ejemplo se ejecuta 3 veces un mismo trozo de código dentro de un ciclo FOR, donde lo único que cambia es el ID del estado civil el cual se obtiene de la variable lin_id_estado_civil que es actualizada por el ciclo FOR, esto es mucho mas eficiente. A diferencia del ejemplo anterior, si debes realizar una modificación solo lo haces una vez y el cambio queda listo para todos los casos en tus PL-SQL Packages en Oracle.

La forma eficaz de resolver esto es haciendo lo siguiente:

/* PL-SQL Packages en Oracle */

For reg_empleado In (  Select id_estado_civil, count(1)  cant_emp

From t_empleado

Group By id_estado_civil )

Loop

If reg_empleado.cant_emp > 50 Then

— procesar empleados

End if;

End Loop;

En este ejemplo se crea un cursor explicito dentro del ciclo FOR, donde se agrupa por el id_estado_civil para contar los empleados de cada uno de los estados. Esta forma es la más eficaz de todas ya que la consulta a la base de datos se realiza solo una vez en tus PL-SQL Packages en Oracle.

Te propongo que pruebes de inmediato este ejemplo en tu Base de Datos con tus propios 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 – Para Tu Éxito con Oracle.

Director del Curso “Domina Tus Packages En Oracle

18 comentarios en «No Dupliques Código en Tus PL-SQL Packages en Oracle, Usa un Ciclo FOR»

  1. Me parecio acertado y amplia la explicación al elaborar varias soluciones al respecto, podria aplicarse una u otra pero la considerada con la agrupacion es la mejor ya que además de estar leyendo los registros uno a uno se tiene la certidumbre de que estan en el grupo para despues aplicar el resultado al numero de registros por estado excelente la ultima solución.

  2. Buena tu acotación Raul de verdad que la ultima opción esta muy eficaz con respecto a resolver una problematica,por mi parte estoy recien iniciando con este lenguaje de programación de los Package en Oracle y hasta el momento no he tenidos problemas: ya he implementados cursores,funciones y llamadas a procedimientos dentros de otros antes me manejaba con el Transact Sql. muchas gracias y espero nuevos tips de programacion pivotes,select case, crear tablas de pasos, etc. Estan muy buenos sigue adelante.

  3. estoy realizando un ciclo parecido ha este pero actualizando solo un registro pero este me arroja un error de comando desconocido!!! esta es la query:

    For Ingreso_Sala In (
    Select Audi.Sala_Audiencia,Count(Audi.Sala_Audiencia)
    From Tb_Int_Capj_Audiencias_Tmp Audi Where Audi.Sala_Audiencia = ‘PISO 6- SALA 1’
    and
    Exists
    (
    Select Sal.Sala,Sal.Sala_Capj_Id From Tb_Int_Capj_Salas sal Where sal.Sala= Audi.Sala_Audiencia
    )
    Group By Audi.Sala_Audiencia–)

    Loop

    –procesar asignacion del id de las salas
    Update Tb_Int_Capj_Audiencias_Tmp Set Sala_Capj_Id = Sal.Sala_Capj_Id Where Sala_Audiencia = Audi.Sala_Audiencia;

    End Loop;

    espero que se pueda comprender desde ya muchas gracias.

    1. Hola David, gracias por escribir, tu ciclo for presenta dos errores:

      1. En la linea: Group By Audi.Sala_Audiencia–)
      tienes omitido el parentesis, debe estar asi: Group By Audi.Sala_Audiencia)

      2. En el set de tu update: Set Sala_Capj_Id = Sal.Sala_Capj_Id
      haces referencia al campo Sal.Sala_Capj_Id que no esta el select de la query.

      Debes corregir esas dos cosas para que te funcione.

      Saludos
      Roberto Vicencio – Para Tu Éxito con Oracle.

      PD: Ya viste mi curso, click aquí:
      https://dominatuspackagesen0racle.com/detalles/

  4. En una palabra: excelente.
    Te agradezco, se que hay muchos que siguen
    Tu trabajo. Por ellos y de mi parte: Gracias por el
    Aporte. Este tu proyecto tiene muy buen futuro.
    Contribuiré.

    1. Hola Kris, gracias por comunicarte y excelente tu comentario, eso es lo que me anima a seguir escribiendo contenido de calidad, gracias nuevamente.

      Saludos
      Roberto Vicencio – Para Tu Éxito con Oracle.

  5. El articulo es excelente porque de forma sencilla transmites el tema y de manera muy practicas lo ejemplificas, te invito a no desistir de esta gran idea pero sobre todo a la forma.

    1. Que tal Efrain, gracias por tu excelente comentario, me da mucho gusto que la información te sea útil y claro que seguiré publicando mas artículos, si te ha gustado el blog recomienda el enlace https://dominatuspackagesen0racle.com/ a tus amigos o personas que también les pueda interesar este contenido, gracias.

      Saludos
      Roberto Vicencio – Para Tu Éxito con Oracle.

  6. TRANSACCION ORDEN DATO VALOR MENSAJE
    Hola:
    Por favor tu gentil ayuda para saber cómo soluciona este error.

    ERROR 1 700027471 ORA-01089: cierre inmediato en curso – no se permite ninguna operación

    ERROR 1 700385851 ORA-01654: no se ha podido ampliar el índice PRODUCCION.OK_TCSLDOS con 8192 en el tablespace TB_INDEXES

    GRACIAS

    1. Hola Fabian, gracias por comunicarte, para el error ORA-01654 debes pedir al DBA que amplíe el espacio del tablespace TB_INDEXES ya que el índice que indicas no encuentra suficiente espacio para el tamaño que tiene, el error ORA-01089 es consecuencia del primero ya que el sistema no puede continuar si no tiene suficiente espacio.

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

      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.