Muchas 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“
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.
Raul, te agradezco mucho tu comentario, esto me incentiva a seguir escribiendo artículos de buena calidad que ayuden a las personas.
Saludos
Roberto Vicencio – Ingeniero en Oracle
Creador del Curso: https://DominaTusPackagesEn0racle.com/detalles
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.
Hola David, excelente tu comentario y no te preocupes porque te estaré avisando de cada material nuevo que este sacando, gracias por comunicarte.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
https://dominatuspackagesen0racle.com/detalles/
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.
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/
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é.
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.
Excelente documento me sirvió de mucha ayuda sigue publicando Gracias
Hola Nicolas, gracias por comunicarte y por tu comentario, me da mucho gusto que esta información te sea útil y te invito a seguir visitando mi blog, gracias.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
https://dominatuspackagesen0racle.com/
Que bueno muy interesante sera de mucha ayuda
Muy buena explicación para el ejemplo, sigue publicando más, si son de mucha ayuda.
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.
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.
Excelente solución, muy inteligente el planteamiento de la ultima respuesta..gracias
Que tal Edgar, gracias por tu excelente comentario, si te ha gustado este artículo te invito a compartir el enlace https://dominatuspackagesen0racle.com/ con tus amigos o personas que también les pueda interesar esta información, gracias.
Saludos
Roberto Vicencio – Para Tu éxito con Oracle.
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
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.