programacion oracle

19
  Saltar Cabeceras  PL / SQL Manual del usuario y de refere ncia Release 2 (9.2) Pieza número A96624-01 Casa  Lista de libros  Contenido  Índice  Master Index  Realimentación 4 PL / SQL Estructuras de control  Un barco navega al este y otra oeste unidades  Con los vientos que soplan mismo.  ¡Es el conjunto de las velas y no el viento ¿Qué nos dice el camino a seguir.  - Ella Wheeler Wilcox En este capítulo se muestra cómo la estructura del flujo de control a través de un programa de PL / SQL. A aprender cómo los estados están conectados por estructuras de control sencillo pero potente que tiene una sola entrada y salida. En conjunto, estas estructuras pueden manejar cualquier situación. Su uso adecuado nos lleva naturalmente a un programa bien estructurado. En este capítulo se tratan los siguientes temas: Descripción general de Estructuras de Control PL / SQL  Condicional de control: if y case declaraciones  Iterativo de control: Las sentencias de bucle y EXIT  Secuencial de control: GOTO y declaraciones NULL  Descripción general de Estructuras de Control PL / SQL De acuerdo con el teorema de la estructura, cualquier programa de ordenador puede ser escrito utilizando las estructuras básicas de control se muestra en la Figura 1.4 . Se pueden combinar en todo lo necesario para hacer frente a un problema determinado. Figura 1.4 Estructuras de Control  

Upload: jose-mejia

Post on 12-Jul-2015

110 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: programacion oracle

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 119

Saltar Cabeceras

PL SQL Manual del usuario y de referencia Release 2 (92) Pieza nuacutemero A96624-01

Casa

Lista delibros

Contenido

Iacutendice

MasterIndex

Realiment

4 PL SQL Estructuras de control

Un barco navega al este y otra oeste unidades Con los vientos que soplan mismo iexclEs el conjunto de las velas y no el viento

iquestQueacute nos dice el camino a seguir - Ella Wheeler WilcoxEn este capiacutetulo se muestra coacutemo la estructura del flujo de control a traveacutes de un programa de PLSQL A aprender coacutemo los estados estaacuten conectados por estructuras de control sencillo pero poteque tiene una sola entrada y salida En conjunto estas estructuras pueden manejar cualquiersituacioacuten Su uso adecuado nos lleva naturalmente a un programa bien estructurado

En este capiacutetulo se tratan los siguientes temas

Descripcioacuten general de Estructuras de Control PL SQL Condicional de control if y case declaraciones Iterativo de control Las sentencias de bucle y EXIT Secuencial de control GOTO y declaraciones NULL

Descripcioacuten general de Estructuras de Control PL SQL

De acuerdo con el teorema de la estructura cualquier programa de ordenador puede ser escritoutilizando las estructuras baacutesicas de control se muestra en la Figura 14 Se pueden combinar entodo lo necesario para hacer frente a un problema determinado

Figura 14 Estructuras de Control

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 219

Descripcioacuten del texto de la ilustracioacuten pls81008_control_structuresgif

La estructura de seleccioacuten de las pruebas de una condicioacuten a continuacioacuten ejecuta una secuenciade instrucciones en lugar de otro dependiendo de si la condicioacuten es verdadera ofalsa Una condicioacuten es una variable o una expresioacuten que devuelve un valor booleano( TRUE o FALSE ) La estructura de iteracioacuten se ejecuta una secuencia de instrucciones de formarepetida siempre y cuando una condicioacuten se cumple La estructura de la secuencia soacutelo se ejecuta

una secuencia de sentencias en el orden en que ocurren

Condicional de control if y case declaraciones

A menudo es necesario tomar acciones alternativas en funcioacuten de lascircunstancias El IF declaracioacuten le permite ejecutar una secuencia de sentencias de formacondicional Es decir si la secuencia se ejecuta o no depende del valor de una condicioacuten Hay treformas de IF declaraciones IF-THEN IF-THEN-ELSE y IF-THEN-ELSIF El CASE declaracioacuten es unaforma compacta de evaluar una condicioacuten uacutenica y elegir entre las muchas alternativas de accioacuten

IF-THEN

La forma maacutes sencilla de IF asocia la declaracioacuten de un estado con una secuencia de sentenciasencerradas por las palabras clave THEN y END IF (no ENDIF ) de la siguiente manera

IF condicioacuten THENsequence_of_statementsEND IF

La secuencia de declaraciones soacutelo se ejecuta si la condicioacuten es verdadera Si la condicioacuten es fals

nula el IF declaracioacuten no hace nada En cualquier caso el control pasa a la siguienteinstruccioacuten Un ejemplo es el siguiente

Si las ventasgt cuota entoncescompute_bonus (empid)ACTUALIZACIOacuteN pago de noacutemina = SET + bonificaciones donde empno = emp_idEND IF

Es posible que desee colocar breve IF declaraciones en una sola liacutenea como en

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 319

Si xgt vuelve a subir y = x END IF

IF-Then-Else

La segunda forma de IF sentencia antildeade la palabra clave ELSE seguido por una secuencia alternatide los estados de la siguiente manera

IF condicioacuten THEN

sequence_of_statements1ELSEsequence_of_statements2END IF

La secuencia de declaraciones en el ELSE claacuteusula soacutelo se ejecuta si la condicioacuten es falsa o nula Plo tanto el ELSE claacuteusula garantiza que una secuencia de sentencias se ejecuta En el siguienteejemplo el primer UPDATEsentencia se ejecuta cuando la condicioacuten es verdadera pero lasegunda UPDATE sentencia se ejecuta cuando la condicioacuten es falsa o nula

SI trans_type = CR THENUPDATE cuentas SET saldo = saldo + de creacutedito en ELSEUPDATE cuentas SET saldo = saldo - deacutebito DONDE END IF

El THEN y ELSE pueden incluir claacuteusulas IF declaraciones Es decir IF declaraciones se puedenanidar como muestra el siguiente ejemplo

SI trans_type = CR THENUPDATE cuentas SET saldo = saldo + de creacutedito en ELSESI saldo_nuevogt = minimum_balance ENTONCESUPDATE cuentas SET saldo = saldo - deacutebito DONDE ELSERAISE insufficient_fundsEND IFEND IF

IF-THEN-ELSIF Declaracioacuten

A veces usted desee seleccionar una accioacuten de varias alternativas mutuamente excluyentes Latercera forma de IF instruccioacuten utiliza la palabra clave ELSIF (no ELSEIF ) para introducir

condiciones adicionales como sigueSI ENTONCES condition1sequence_of_statements1ELSIF condition2 ENTONCESsequence_of_statements2ELSEsequence_of_statements3END IF

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 419

Si la primera condicioacuten es falsa o nula el ELSIF claacuteusula de las pruebas de otracondicioacuten Un IF declaracioacuten puede tener cualquier nuacutemero de ELSIF claacuteusulas lafinal ELSE claacuteusula es opcional Las condiciones son evaluadas una por una de arriba abajo Sicualquier condicioacuten es verdadera su secuencia de estados asociados se ejecuta y el control pasa asiguiente instruccioacuten Si todas las condiciones son falsas o nulo la secuencia en el ELSE se ejecutala claacuteusula Consideremos el siguiente ejemplo

COMENZARSi las ventasgt 50000 THENbono = 1500ELSIF ventasgt 35000 THENbono = 500ELSEbono = 100END IFINSERT INTO VALORES noacutemina (emp_id bonus )END

Si el valor de sales es mayor que 50000 la primera y segunda condicioacuten son verdaderas Sinembargo bonus se le asigna el valor apropiado de 1500 debido a que la segunda condicioacuten no se hprobado Cuando la primera condicioacuten es verdadera la sentencia asociada se ejecuta y el controlpasa a la INSERT comunicado

CASE

Al igual que el IF declaracioacuten el CASE declaracioacuten selecciona una secuencia de comandos que seejecutan Sin embargo para seleccionar la secuencia el CASE instruccioacuten utiliza un selector en lugde muacuteltiples expresiones booleanas (Recuerde que en el capiacutetulo 2 que el selector es una expresi

cuyo valor se utiliza para seleccionar una de varias alternativas) Para compararel IF y CASE declaraciones considere el siguiente coacutedigo que las salidas de las descripciones de logrados de la escuela

SI = grado Adbms_outputput_line (Excelente)ELSIF grado = B THENdbms_outputput_line (Muy Bueno)ELSIF grado = C THENdbms_outputput_line (bueno)ELSIF grado = D THENDBMS_OUTPUT put_line (Fair)ELSIF grado = F THENdbms_outputput_line (Pobre)ELSEdbms_outputput_line (No hay tal grado )END IF

Aviso de los cinco expresiones booleanas En cada caso comprobamos si la mismavariable grade es igual a uno de los cinco valores A B C D o F Vamos a reescribel coacutedigo anterior con el CASEdeclaracioacuten de la siguiente manera

CASO grado

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 519

CUANDO A dbms_outputput_line (Excelente)Cuando B THEN dbms_outputput_line (Muy Bueno)Cuando C THEN dbms_outputput_line (bueno)Cuando el entonces D dbms_outputput_line (Fair)CUANDO F THEN dbms_outputput_line (Pobre)ELSE dbms_outputput_line (No hay tal grado )END CASE

El CASE declaracioacuten es maacutes legible y maacutes eficiente Por lo tanto cuando sea posible vuelva aescribir largas IF-THEN-ELSIF declaraciones como CASE declaraciones

El CASE declaracioacuten comienza con la palabra clave CASE La palabra clave es seguido por unselector que es la variable grade en el uacuteltimo ejemplo La expresioacuten selector puede serarbitrariamente compleja Por ejemplo puede contener llamadas a funciones Por lo general sinembargo se trata de una sola variable La expresioacuten selector se evaluacutea soacutelo una vez Losrendimientos de los que valor puede tener cualquier tipo de datos PL SQL que no BLOB BFILE tipo de objeto un registro PL SQL un iacutendice por tabla VARRAY o una tabla anidada

El selector es seguido por uno o maacutes WHEN claacuteusulas que se comprueban de forma secuencial Elvalor de la claacuteusula de seleccioacuten determina que se ejecuta Si el valor del selector es igual al valorde un WHEN expresioacuten claacuteusula que WHEN claacuteusula se ejecuta Por ejemplo en el uacuteltimo ejemplosi grade es igual a C el programa de salidas de Good Nunca cae a traveacutes de la ejecucioacuten en caso WHEN claacuteusula se ejecuta el control pasa a la siguiente instruccioacuten

El ELSE claacuteusula funciona de manera similar a la ELSE claacuteusula de un IF comunicado En el uacuteltimoejemplo si la calificacioacuten no es una de las opciones cubiertas por una WHEN claacuteusulael ELSE claacuteusula se ha seleccionado y la frase No such grade es la salida El ELSE claacuteusula esopcional Sin embargo si se omite el ELSE claacuteusula PL SQL agrega lo siguiente

impliacutecita ELSE claacuteusulaELSE RAISE CASE_NOT_FOUND

Si el CASE declaracioacuten selecciona el impliacutecito ELSE claacuteusula PL SQL plantea la excepcioacutenpredefinida CASE_NOT_FOUND Por lo tanto siempre hay una accioacuten predeterminada incluso cuandse omite el ELSE claacuteusula

Las palabras clave END CASE terminar el CASE comunicado Estas dos palabras clave deben estarseparadas por un espacio El CASE instruccioacuten tiene la forma siguiente

[ltltlabel_namegtgt]CASO selectorCUANDO ENTONCES expression1 sequence_of_statements1CUANDO ENTONCES sequence_of_statements2 expression2CUANDO ENTONCES expressionN sequence_of_statementsN[MAacuteS sequence_of_statementsN 1]CASO EXTREMO [LABEL_NAME]

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 619

Como bloques PL SQL CASE declaraciones pueden ser etiquetados La etiqueta un identificadono declarado cerrado entre pareacutentesis angulares dobles debe aparecer al principio dela CASE comunicadoOpcionalmente el nombre de la etiqueta tambieacuten puede aparecer al final dela CASE comunicado

Las excepciones planteadas durante la ejecucioacuten de un CASE declaracioacuten se manejan de la manerahabitual Es decir las paradas normales de ejecucioacuten y control se transfiere a la parte de control d

excepciones de PL SQL bloque o subprograma

Una alternativa a la CASE declaracioacuten es el CASE expresioacuten donde cada WHEN claacuteusula es unaexpresioacuten Para maacutes detalles consulte Expresiones CASE

CASE de buacutesqueda Declaracioacuten

PL SQL tambieacuten proporciona un buscado CASE declaracioacuten que tiene la forma

[ltltlabel_namegtgt]CASO

CUANDO ENTONCES search_condition1 sequence_of_statements1CUANDO ENTONCES search_condition2 sequence_of_statements2CUANDO ENTONCES search_conditionN sequence_of_statementsN[MAacuteS sequence_of_statementsN 1]CASO EXTREMO [LABEL_NAME]

La buacutesqueda CASE declaracioacuten no tiene selector Ademaacutes su WHEN claacuteusulas contienen lascondiciones de buacutesqueda que generan un valor booleano no expresiones que pueden producir unvalor de cualquier tipo Un ejemplo es el siguiente

CASOCUANDO grado = A dbms_outputput_line (Excelente)CUANDO grado = B THEN dbms_outputput_line (Muy Bueno)CUANDO grado = C THEN dbms_outputput_line (bueno)CUANDO grado = D THEN dbms_outputput_line (Fair)CUANDO grado = F THEN dbms_outputput_line (Pobre)ELSE dbms_outputput_line (No hay tal grado )END CASE

Las condiciones de buacutesqueda son evaluados de forma secuencial El valor booleano de cadacondicioacuten de buacutesqueda determina queacute WHEN claacuteusula se ejecuta Si una condicioacuten de buacutesqueda da

como resultado TRUE suWHEN claacuteusula se ejecuta Si alguna WHEN claacuteusula se ejecuta el control paa la siguiente instruccioacuten las condiciones de buacutesqueda para posteriores no son evaluados

Si ninguna de las condiciones de buacutesqueda da como resultado TRUE el ELSE se ejecuta laclaacuteusula El ELSE claacuteusula es opcional Sin embargo si se omite el ELSE claacuteusula PL SQL agreglo siguiente impliacutecita ELSEclaacuteusula

ELSE RAISE CASE_NOT_FOUND

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 719

Las excepciones planteadas durante la ejecucioacuten de una buacutesqueda CASE declaracioacuten se manejan dela manera habitual Es decir las paradas normales de ejecucioacuten y control se transfiere a la parte dcontrol de excepciones de PL SQL bloque o subprograma

Directrices para PL SQL Sentencias condicionales

Evite torpes IF declaraciones como las del siguiente ejemplo

SI minimum_balance saldo_nuevo ltENTONCESdescubierto = TRUEELSEdescubierto = falseEND IFSI descubierto = TRUE THENRAISE insufficient_fundsEND IF

Este coacutedigo no tiene en cuenta dos hechos uacutetiles En primer lugar el valor de una expresioacuten

booleana se pueden asignar directamente a una variable Boolean Por lo tanto puede reemplazar primera IF declaracioacuten con una simple asignacioacuten de la siguiente manera

descubierto = saldo_nuevo ltminimum_balance

En segundo lugar una variable booleana en siacute es verdadera o falsa Por lo tanto puede simplificala condicioacuten en la segunda IF declaracioacuten de la siguiente manera

SI ENTONCES descubierto

Cuando sea posible utilice el ELSIF claacuteusula en lugar de anidada IF declaraciones De esta manerel coacutedigo seraacute maacutes faacutecil de leer y entender Compare las siguientes IF declaraciones

SI ENTONCES condition1 | SI ENTONCES condition1sentencia1 | sentencia1ELSE | ELSIF condition2 ENTONCESSI ENTONCES condition2 | instruccioacuten2instruccioacuten2 | ELSIF Condition3 ENTONCESELSE | Sentencia3SI ENTONCES Condition3 | END IFSentencia3 |END IF |END IF |END IF |

Estas declaraciones son loacutegicamente equivalentes pero la primera declaracioacuten oscurece el flujo dla loacutegica mientras que la segunda declaracioacuten que revela

Si usted estaacute comparando una sola expresioacuten de varios valores se puede simplificar la loacutegicamediante el uso de un uacutenico CASE declaracioacuten en lugar de un IF con varios ELSIF claacuteusulas

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 819

Iterativo de control Las sentencias de bucle y EXIT

LOOP declaraciones permiten ejecutar una secuencia de instrucciones varias veces Hay tres formade LOOP declaraciones LOOP WHILE-LOOP y FOR-LOOP

LOOP

La forma maacutes simple de LOOP declaracioacuten es la base (o infinito) de bucle que incluye una secuencde sentencias entre las palabras clave LOOP y END LOOP como sigue

LOOPsequence_of_statementsEND LOOP

Con cada repeticioacuten del bucle la secuencia de instrucciones se ejecuta el control se reanuda en laparte superior del bucle Si el procesamiento adicional es indeseable o imposible puede utilizaruna EXIT declaracioacuten para completar el ciclo Usted puede colocar una o maacutes EXIT declaraciones e

cualquier lugar dentro de un bucle pero en ninguna parte fuera de un bucle Hay dos formasde EXIT declaraciones EXIT y EXIT-WHEN

SALIDA

La EXIT declaracioacuten fuerzas para completar un ciclo sin condiciones Cuando una EXIT se encuentla instruccioacuten el bucle finaliza inmediatamente y el control pasa a la siguiente instruccioacuten Unejemplo es el siguiente

LOOP

SI credit_rating lt3 entoncesEXIT - loop salir inmediatamenteEND IFEND LOOP- El control vuelve aquiacute

El siguiente ejemplo muestra que no se puede usar la EXIT declaracioacuten para completar un bloque SQL

COMENZAR

SI credit_rating lt3 entoncesEXIT - no se permiteEND IFEND

Recuerde la EXIT declaracioacuten debe ser colocado dentro de un bucle Para completar un bloque PLSQL antes de su finalizacioacuten normal se alcanza puede utilizar el RETURN comunicado Para maacutesinformacioacuten consulteUso de la instruccioacuten RETURN

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 919

EXIT-AL

El EXIT-WHEN declaracioacuten permite que un circuito completo de forma condicional Cuando la EXIT

encuentra la instruccioacuten la condicioacuten en la WHEN claacuteusula se evaluacutea Si la condicioacuten es verdadera ciclo se completa y el control pasa a la siguiente sentencia despueacutes del bucle Un ejemplo es elsiguiente

LOOPFETCH C1 EN SALIDA AL NOTFOUND c1 - bucle de salida si la condicioacuten es verdaderaEND LOOPCLOSE c1

Hasta que la condicioacuten es verdadera el bucle no se puede completar Por lo tanto una declaracioacutendentro del bucle debe cambiar el valor de la condicioacuten En el uacuteltimo ejemplo si el FETCH sentencidevuelve una fila la condicioacuten es falsa Cuando el FETCH declaracioacuten no devuelve una fila lacondicioacuten es verdadera el ciclo se completa y el control pasa a la CLOSE comunicado

El EXIT-WHEN declaracioacuten sustituye a un simple IF comunicado Por ejemplo compare las siguiendeclaraciones

Si el recuentogt 100 THEN | SALIDA CUANDO cuentagt 100EXIT |END IF |

Estas declaraciones son loacutegicamente equivalentes pero el EXIT-WHEN declaracioacuten es maacutes faacutecil deleer y entender

Etiquetas de bucle

Como bloques PL SQL loops pueden ser etiquetados La etiqueta un identificador no declaradocerrado entre pareacutentesis angulares dobles debe aparecer al principio de la LOOP declaracioacuten de lasiguiente manera

ltltlabel_namegtgtLOOPsequence_of_statementsEND LOOP

Opcionalmente el nombre de la etiqueta tambieacuten puede aparecer al final de la LOOP declaracioacutencomo muestra el siguiente ejemplo

ltltmy_loopgtgtLOOPEND LOOP my_loop

Al nidos marcados ciclos el uso final los nombres de etiqueta para mejorar la legibilidad

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1019

Con cualquier forma de EXIT declaracioacuten usted puede completar no soacutelo el lazo de corriente peroninguacuten lazo de inclusioacuten Simplemente la etiqueta del bucle encierra que desea completar Acontinuacioacuten utilice la etiqueta de una EXIT declaracioacuten de la siguiente manera

ltltoutergtgtLOOPLOOP

SALIDA exterior cuando - Salida de los dos buclesEND LOOPEND LOOP exterior

Cada adjuntando bucle hasta e incluyendo el bucle etiquetado se sale

Bucle while

El WHILE-LOOP socios la declaracioacuten de un estado con una secuencia de sentencias encerradas por

palabras clave LOOP y END LOOP como sigue

MIENTRAS condicioacuten de buclesequence_of_statementsEND LOOP

Antes de cada iteracioacuten del bucle se evaluacutea la condicioacuten Si la condicioacuten es verdadera la secuencde instrucciones se ejecuta el control se reanuda en la parte superior del bucle Si la condicioacuten esfalsa o nula el bucle se pasa por alto y el control pasa a la siguiente instruccioacuten Un ejemplo es elsiguiente

Mientras que el total lt= 25000 LOOPSELECCIONAR sal en el sueldo de EMP DONDE total = salario total +END LOOP

El nuacutemero de iteraciones depende de la condicioacuten y se desconoce hasta que el bucle termina Lacondicioacuten se comprueba en la parte superior del bucle por lo que la secuencia podriacutea ejecutar porcero En el uacuteltimo ejemplo si el valor inicial del total es mayor que 25000 la condicioacuten es falsael bucle se pasa por alto

Algunos idiomas tienen una LOOP UNTIL o REPEAT UNTIL estructura lo que prueba la condicioacuten en parte inferior del bucle en lugar de en la parte superior Por lo tanto la secuencia de instruccionesque se ejecuta al menos una vez PL SQL no tiene una estructura tal pero se puede construir unode la siguiente manera

LOOPsequence_of_statementsSALIDA AL boolean_expressionEND LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1119

Para asegurarse de que una WHILE bucle se ejecuta al menos una vez utilizar una variable Booleaninicializa en el estado de la siguiente manera

hecho = falseMIENTRAS NO hacer LOOPsequence_of_statementshecho = boolean_expressionEND LOOP

Una declaracioacuten dentro del bucle debe asignar un nuevo valor a la variable booleana De locontrario usted tiene un bucle infinito Por ejemplo el siguiente LOOP declaraciones sonloacutegicamente equivalentes

Bucle WHILE TRUE | LOOP | END LOOP | END LOOP

FOR-LOOP

Mientras que el nuacutemero de iteraciones a traveacutes de un WHILE bucle no se conoce hasta el bucletermina el nuacutemero de iteraciones a traveacutes de una FOR bucle se conoce antes de que el bucle seintroduce FOR bucles iterar a traveacutes de un rango especiacutefico de nuacutemeros enteros La gama es parteun esquema de iteracioacuten que estaacute rodeada por las palabras clave FOR y LOOP Un doble punto ( es el operador de rango La sintaxis es la siguiente

PARA contador en [atraacutes] lower_bound higher_bound LOOPsequence_of_statementsEND LOOP

La gama se evaluacutea cuando la FOR bucle se entroacute por primera vez y nunca volver a evaluarse

Como muestra el siguiente ejemplo la secuencia de instrucciones se ejecuta una vez para cadaentero en el rango Despueacutes de cada iteracioacuten el contador del bucle se incrementa

FOR i IN 1 3 LOOP - asignar los valores 123 para isequence_of_statements - ejecuta tres vecesEND LOOP

El siguiente ejemplo muestra que si el liacutemite inferior es igual a la mayor liacutemite la secuencia de

instrucciones se ejecuta una vez

FOR i IN 3 3 LOOP - asignar el valor 3 para isequence_of_statements - se ejecuta una vezEND LOOP

Por los ingresos por defecto la iteracioacuten hacia arriba de la cota inferior a los consolidados maacutesaltos Sin embargo como muestra el siguiente ejemplo si utiliza la palabra clave REVERSE proceiteracioacuten hacia abajo desde el alto obligado a la cota inferior Despueacutes de cada iteracioacuten el contad

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1219

del bucle se decrementa Sin embargo se escriben los liacutemites variacutean en orden ascendente (nodescendente)

FOR i IN REVERSE 1 3 LOOP - asignar los valores de 321 isequence_of_statements - ejecuta tres vecesEND LOOP

Dentro de una FOR bucle el contador del bucle se puede hacer referencia como una constante perno se puede asignar valores como muestra el siguiente ejemplo

PARA CTR en 1 10 LOOPSI NO ENTONCES terminadoINSERT INTO VALUES (ctr ) - legalfactor = ctr 2 - legalELSEctr = 10 - no se permiteEND IFEND LOOP

Esquemas de iteracioacuten

Los liacutemites de un rango de bucle puede ser literales variables o expresiones sino que debe evalua los nuacutemeros De lo contrario PL SQL lanza la excepcioacuten predefinida VALUE_ERROR El liacutemiteinferior no tiene que ser 1 como los ejemplos a continuacioacuten muestran Sin embargo el incremendel contador del bucle (o disminuir) debe ser 1

j EN -5 5k AL REVEacuteS primero uacuteltimapaso en 0 TRUNCAR (alto bajo) 2

Internamente PL SQL asigna los valores de los liacutemites temporales a PLS_INTEGER variables y sinecesario redondea los valores al entero maacutes cercano El rango de magnitud de un PLS_INTEGER ede -2 31 2 31 Por lo tanto si un liacutemite como resultado un nuacutemero fuera del rango seobtiene un error de desbordamiento numeacuterico cuando PL SQL los intentos de la asignacioacuten commuestra el siguiente ejemplo

DECLARENUacuteMERO hi = 2 32COMENZARPara j EN 1 LOOP hi - provoca un error de un desbordamiento numeacuterico

END LOOPEND

Algunos lenguajes proporcionan STEP claacuteusula que le permite especificar un incremento diferent(5 en vez de 1 por ejemplo) PL SQL no tiene una estructura tal pero se puede construiruno Dentro de la FOR bucle simplemente se multiplica cada referencia al contador del bucle por enuevo incremento En el siguiente ejemplo se asigna la fecha de hoy a los elementos de 5 10 y 1de un iacutendice por tabla

DECLARE

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1319

DateList TIPO ES LA MESA DEL IacuteNDICE DE FECHA POR BINARY_INTEGERfechas DateListINTEGER constante k = 5 - conjunto nuevo incrementoCOMENZARPara j EN 1 3 LOOPfechas (j k) = SYSDATE - se multiplican bucle contador incrementoEND LOOPEND

Rangos dinaacutemicos

PL SQL le permite determinar el rango de bucle de forma dinaacutemica en tiempo de ejecucioacuten commuestra el siguiente ejemplo

SELECT COUNT (empno) EN emp_count del EMPFOR i IN 1 LOOP emp_countEND LOOP

El valor de emp_count se desconoce en tiempo de compilacioacuten el SELECT instruccioacuten devuelve elvalor en tiempo de ejecucioacuten

iquestQueacute pasa si el liacutemite inferior de un rango de bucle evaluacutea a un entero mayor que el liacutemitesuperior Como muestra el siguiente ejemplo la secuencia de declaraciones dentro del bucle no sejecuta y el control pasa a la siguiente sentencia

- Liacutemite se convierte en unDE LOOP liacutemite i IN 2 sequence_of_statements - ejecuta cero vecesEND LOOP

- El control pasa aquiacute

Las reglas de aacutembito

El contador del bucle soacutelo se define dentro del bucle No se puede hacer referencia a eacutel fuera delbucle Despueacutes se sale del bucle el contador del bucle no estaacute definido como muestra el siguientejemplo

PARA CTR en 1 10 LOOPEND LOOPsuma = ctr - 1 - no se permite

Usted no necesita declarar expliacutecitamente el contador del bucle ya que se declara impliacutecitamentecomo una variable local de tipo INTEGER El siguiente ejemplo muestra que la declaracioacuten localoculta cualquier declaracioacuten global

DECLAREctr INTEGERCOMENZARPARA CTR en 1 25 LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1419

Si Ctrgt 10 THEN - Se refiere al contador del bucleEND LOOPEND

Para hacer referencia a la variable global en este ejemplo debe utilizar una etiqueta y la notacioacutenpuntos como sigue

ltltmaingtgtDECLAREctr INTEGERCOMENZARPARA CTR en 1 25 LOOPSI mainctrgt 10 THEN - se refiere a la variable globalEND IFEND LOOPEND principal

Las reglas del aacutembito mismo se aplica a anidar FOR bucles Considere el siguiente ejemplo Ambocontadores de bucles con el mismo nombre Por lo tanto para hacer referencia al contador del buexterno del bucle interno debe utilizar una etiqueta y la notacioacuten de puntos como sigue

ltltoutergtgtPara el paso en 1 25 LOOPPara el paso en 1 10 LOOPSI outerstepgt 15 ENTONCES END LOOP

END LOOP exterior

Utilizando la sentencia EXIT

La EXIT declaracioacuten permite una FOR vuelta completa antes de tiempo Por ejemplo el siguientebucle se ejecuta normalmente diez veces pero tan pronto como el FETCH declaracioacuten no devuelveuna fila el ciclo se completa no importa cuaacutentas veces se ha ejecutado

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA AL NOTFOUND c1

END LOOP

Suponga que usted debe salir de un anidados FOR bucle antes de tiempo Puede completar no soacutelolazo de corriente pero ninguacuten lazo de inclusioacuten Simplemente la etiqueta del bucle encierra quedesea completar A continuacioacuten utilice la etiqueta de una EXIT declaracioacuten para especificarqueacute FOR bucle de salida de la siguiente manera

ltltoutergtgtFOR i IN 1 5 LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1519

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA exterior cuando NOTFOUND c1 - salida tanto para los buclesEND LOOPEND LOOP exterior- El control pasa aquiacute

Secuencial de control GOTO y declaraciones NULL

A diferencia de la IF y LOOP declaraciones el GOTO y NULL declaraciones no son cruciales para PL SQL de programacioacuten La estructura de PL SQL es tal que el GOTO declaracioacuten es rara veznecesario De vez en cuando se puede simplificar la loacutegica suficiente como para justificar suuso La NULL declaracioacuten puede mejorar la legibilidad al hacer que el significado y la accioacuten de lasentencias condicionales claro

El uso excesivo de GOTO declaraciones puede generar un coacutedigo complejo no estructurada (a vecellamado spaghetti coacutedigo) que es difiacutecil de entender y mantener Por lo tanto el

uso GOTO declaraciones con moderacioacuten Por ejemplo para poder partir de una estructura anidadauna rutina de control de errores una excepcioacuten en lugar de utilizar un GOTO comunicado

GoTo

El GOTO ramas declaracioacuten a una etiqueta de manera incondicional La etiqueta debe ser uacutenico en alcance y debe preceder a una sentencia ejecutable o un bloque PL SQL Cuando se ejecutael GOTO transfiere el informe de control a la sentencia etiquetada o del bloque En el siguienteejemplo usted va a una sentencia ejecutable maacutes abajo en una secuencia de instrucciones

COMENZARGOTO insert_rowltltinsert_rowgtgtINSERT INTO VALORES emp END

En el siguiente ejemplo usted va a un bloque PL SQL maacutes arriba en una secuencia deinstrucciones

COMENZARltltupdate_rowgtgtCOMENZARACTUALIZACIOacuteN eacutenfasis JUEGO ENDGOTO update_rowEND

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1619

La etiqueta end_loop en el siguiente ejemplo no estaacute permitido porque no precede a una sentenciaejecutable

DECLAREhace booleanCOMENZARFOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgt - No se permiteEND LOOP - no es una sentencia ejecutableEND

Para depurar el uacuteltimo ejemplo soacutelo tiene que antildeadir el NULL declaracioacuten de la siguiente manera

FOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgtNULL - una sentencia ejecutableEND LOOP

Como muestra el siguiente ejemplo un GOTO declaracioacuten puede rama de un bloque que lo contiendesde el bloque actual

DECLAREmy_ename CHAR (10)COMENZARltltget_namegtgtSELECCIONAR Ename EN my_ename de EMP DONDE COMENZARObtiene_nombre GOTO - rama adjuntando bloqueENDEND

El GOTO ramas declaracioacuten al primer bloque encierra en el que la etiqueta se hace referencia apare

Restricciones

Algunos de los destinos posibles de un GOTO declaracioacuten no se permite En concretoun GOTO declaracioacuten no puede bifurcarse en un IF declaracioacuten CASE declaracioacuten LOOP declaracioacutensub-bloque Por ejemplo la siguiente GOTO declaracioacuten no se permite

COMENZARGOTO update_row - no se ramifican en IFSI ENTONCES vaacutelida

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1719

ltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

Como muestra el siguiente ejemplo un GOTO declaracioacuten no puede rama de un IF claacuteusula dedeclaracioacuten a otra Del mismo modo un GOTO declaracioacuten no puede rama deun CASE declaracioacuten WHEN claacuteusula a otra

COMENZARSI ENTONCES vaacutelidaGOTO update_row - no se ramifican en la claacuteusula ELSEELSEltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

El siguiente ejemplo muestra que un GOTO declaracioacuten no puede rama de un bloque que lo contienen un sub-bloque

COMENZARSi el estado = obsoletos THENGOTO delete_part - no se ramifican en sub-bloqueEND IFCOMENZAR

ltltdelete_partgtgtCANCELACIOacuteN de piezas en las ENDEND

Ademaacutes un GOTO declaracioacuten no puede ramificar hacia fuera de un subprograma como muestra esiguiente ejemplo

DECLARE

PROCEDIMIENTO compute_bonus (NUacuteMERO emp_id) ESCOMENZARGOTO update_row - no se puede ramificar hacia fuera del subprogramaENDCOMENZARltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1819

Por uacuteltimo un GOTO declaracioacuten no puede rama de un manejador de excepcioacuten en el bloqueactual Por ejemplo la siguiente GOTO declaracioacuten no se permite

DECLAREpe_ratio REALCOMENZARSelecciona el precio NVL (ingresos 0) en pe_ratio DE

ltltinsert_rowgtgtINSERT INTO VALORES Estadiacutesticas (pe_ratio )EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEpe_ratio = 0GOTO insert_row - no se puede poder en el bloque actualEND

Sin embargo un GOTO declaracioacuten puede rama de un manejador de excepciones en un bloque que contiene

Declaracioacuten de NULL

La NULL declaracioacuten no hace otra cosa que el control pase a la siguiente instruccioacuten En unconstructor condicional el NULL declaracioacuten dice a los lectores la posibilidad de que se haconsiderado pero no hay accioacuten que sea necesaria En el siguiente ejemplo el NULL declaracioacutendemuestra que no se toman medidas de excepcioacuten sin nombre

EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEROLLBACKCUANDO ENTONCES VALUE_ERROR

INSERT INTO VALORES errores COMMITCUANDO OTROS ENTONCESNULLEND

En IF las declaraciones u otros lugares que requieren por lo menos una sentencia ejecutableel NULL declaracioacuten para satisfacer a la sintaxis En el siguiente ejemplo el NULL declaracioacuten hacehincapieacute en que soacutelo los mejores empleados reciban bonificaciones

Si la calificacioacutengt 90 THEN

compute_bonus (emp_id)ELSENULLEND IF

Ademaacutes el NULL declaracioacuten es una forma praacutectica para crear recibos de la hora de disentildearaplicaciones de arriba hacia abajo Un taloacuten se subprograma ficticio que le permite diferir ladefinicioacuten de un procedimiento o funcioacuten hasta que probar y depurar el programa principal En elsiguiente ejemplo el NULL declaracioacuten cumple con el requisito de que al menos una declaracioacutendebe aparecer en la parte ejecutable de un subprograma

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1919

PROCEDIMIENTO debit_account (acct_id INTEGER REAL cantidad) ESCOMENZARNULLEND debit_account

Copyright copy 1996 2002 Oracle Corporation Todos los derechos reservados

Casa

Lista delibros

Contenido

Iacutendice

MasterIndex

Realiment

Page 2: programacion oracle

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 219

Descripcioacuten del texto de la ilustracioacuten pls81008_control_structuresgif

La estructura de seleccioacuten de las pruebas de una condicioacuten a continuacioacuten ejecuta una secuenciade instrucciones en lugar de otro dependiendo de si la condicioacuten es verdadera ofalsa Una condicioacuten es una variable o una expresioacuten que devuelve un valor booleano( TRUE o FALSE ) La estructura de iteracioacuten se ejecuta una secuencia de instrucciones de formarepetida siempre y cuando una condicioacuten se cumple La estructura de la secuencia soacutelo se ejecuta

una secuencia de sentencias en el orden en que ocurren

Condicional de control if y case declaraciones

A menudo es necesario tomar acciones alternativas en funcioacuten de lascircunstancias El IF declaracioacuten le permite ejecutar una secuencia de sentencias de formacondicional Es decir si la secuencia se ejecuta o no depende del valor de una condicioacuten Hay treformas de IF declaraciones IF-THEN IF-THEN-ELSE y IF-THEN-ELSIF El CASE declaracioacuten es unaforma compacta de evaluar una condicioacuten uacutenica y elegir entre las muchas alternativas de accioacuten

IF-THEN

La forma maacutes sencilla de IF asocia la declaracioacuten de un estado con una secuencia de sentenciasencerradas por las palabras clave THEN y END IF (no ENDIF ) de la siguiente manera

IF condicioacuten THENsequence_of_statementsEND IF

La secuencia de declaraciones soacutelo se ejecuta si la condicioacuten es verdadera Si la condicioacuten es fals

nula el IF declaracioacuten no hace nada En cualquier caso el control pasa a la siguienteinstruccioacuten Un ejemplo es el siguiente

Si las ventasgt cuota entoncescompute_bonus (empid)ACTUALIZACIOacuteN pago de noacutemina = SET + bonificaciones donde empno = emp_idEND IF

Es posible que desee colocar breve IF declaraciones en una sola liacutenea como en

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 319

Si xgt vuelve a subir y = x END IF

IF-Then-Else

La segunda forma de IF sentencia antildeade la palabra clave ELSE seguido por una secuencia alternatide los estados de la siguiente manera

IF condicioacuten THEN

sequence_of_statements1ELSEsequence_of_statements2END IF

La secuencia de declaraciones en el ELSE claacuteusula soacutelo se ejecuta si la condicioacuten es falsa o nula Plo tanto el ELSE claacuteusula garantiza que una secuencia de sentencias se ejecuta En el siguienteejemplo el primer UPDATEsentencia se ejecuta cuando la condicioacuten es verdadera pero lasegunda UPDATE sentencia se ejecuta cuando la condicioacuten es falsa o nula

SI trans_type = CR THENUPDATE cuentas SET saldo = saldo + de creacutedito en ELSEUPDATE cuentas SET saldo = saldo - deacutebito DONDE END IF

El THEN y ELSE pueden incluir claacuteusulas IF declaraciones Es decir IF declaraciones se puedenanidar como muestra el siguiente ejemplo

SI trans_type = CR THENUPDATE cuentas SET saldo = saldo + de creacutedito en ELSESI saldo_nuevogt = minimum_balance ENTONCESUPDATE cuentas SET saldo = saldo - deacutebito DONDE ELSERAISE insufficient_fundsEND IFEND IF

IF-THEN-ELSIF Declaracioacuten

A veces usted desee seleccionar una accioacuten de varias alternativas mutuamente excluyentes Latercera forma de IF instruccioacuten utiliza la palabra clave ELSIF (no ELSEIF ) para introducir

condiciones adicionales como sigueSI ENTONCES condition1sequence_of_statements1ELSIF condition2 ENTONCESsequence_of_statements2ELSEsequence_of_statements3END IF

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 419

Si la primera condicioacuten es falsa o nula el ELSIF claacuteusula de las pruebas de otracondicioacuten Un IF declaracioacuten puede tener cualquier nuacutemero de ELSIF claacuteusulas lafinal ELSE claacuteusula es opcional Las condiciones son evaluadas una por una de arriba abajo Sicualquier condicioacuten es verdadera su secuencia de estados asociados se ejecuta y el control pasa asiguiente instruccioacuten Si todas las condiciones son falsas o nulo la secuencia en el ELSE se ejecutala claacuteusula Consideremos el siguiente ejemplo

COMENZARSi las ventasgt 50000 THENbono = 1500ELSIF ventasgt 35000 THENbono = 500ELSEbono = 100END IFINSERT INTO VALORES noacutemina (emp_id bonus )END

Si el valor de sales es mayor que 50000 la primera y segunda condicioacuten son verdaderas Sinembargo bonus se le asigna el valor apropiado de 1500 debido a que la segunda condicioacuten no se hprobado Cuando la primera condicioacuten es verdadera la sentencia asociada se ejecuta y el controlpasa a la INSERT comunicado

CASE

Al igual que el IF declaracioacuten el CASE declaracioacuten selecciona una secuencia de comandos que seejecutan Sin embargo para seleccionar la secuencia el CASE instruccioacuten utiliza un selector en lugde muacuteltiples expresiones booleanas (Recuerde que en el capiacutetulo 2 que el selector es una expresi

cuyo valor se utiliza para seleccionar una de varias alternativas) Para compararel IF y CASE declaraciones considere el siguiente coacutedigo que las salidas de las descripciones de logrados de la escuela

SI = grado Adbms_outputput_line (Excelente)ELSIF grado = B THENdbms_outputput_line (Muy Bueno)ELSIF grado = C THENdbms_outputput_line (bueno)ELSIF grado = D THENDBMS_OUTPUT put_line (Fair)ELSIF grado = F THENdbms_outputput_line (Pobre)ELSEdbms_outputput_line (No hay tal grado )END IF

Aviso de los cinco expresiones booleanas En cada caso comprobamos si la mismavariable grade es igual a uno de los cinco valores A B C D o F Vamos a reescribel coacutedigo anterior con el CASEdeclaracioacuten de la siguiente manera

CASO grado

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 519

CUANDO A dbms_outputput_line (Excelente)Cuando B THEN dbms_outputput_line (Muy Bueno)Cuando C THEN dbms_outputput_line (bueno)Cuando el entonces D dbms_outputput_line (Fair)CUANDO F THEN dbms_outputput_line (Pobre)ELSE dbms_outputput_line (No hay tal grado )END CASE

El CASE declaracioacuten es maacutes legible y maacutes eficiente Por lo tanto cuando sea posible vuelva aescribir largas IF-THEN-ELSIF declaraciones como CASE declaraciones

El CASE declaracioacuten comienza con la palabra clave CASE La palabra clave es seguido por unselector que es la variable grade en el uacuteltimo ejemplo La expresioacuten selector puede serarbitrariamente compleja Por ejemplo puede contener llamadas a funciones Por lo general sinembargo se trata de una sola variable La expresioacuten selector se evaluacutea soacutelo una vez Losrendimientos de los que valor puede tener cualquier tipo de datos PL SQL que no BLOB BFILE tipo de objeto un registro PL SQL un iacutendice por tabla VARRAY o una tabla anidada

El selector es seguido por uno o maacutes WHEN claacuteusulas que se comprueban de forma secuencial Elvalor de la claacuteusula de seleccioacuten determina que se ejecuta Si el valor del selector es igual al valorde un WHEN expresioacuten claacuteusula que WHEN claacuteusula se ejecuta Por ejemplo en el uacuteltimo ejemplosi grade es igual a C el programa de salidas de Good Nunca cae a traveacutes de la ejecucioacuten en caso WHEN claacuteusula se ejecuta el control pasa a la siguiente instruccioacuten

El ELSE claacuteusula funciona de manera similar a la ELSE claacuteusula de un IF comunicado En el uacuteltimoejemplo si la calificacioacuten no es una de las opciones cubiertas por una WHEN claacuteusulael ELSE claacuteusula se ha seleccionado y la frase No such grade es la salida El ELSE claacuteusula esopcional Sin embargo si se omite el ELSE claacuteusula PL SQL agrega lo siguiente

impliacutecita ELSE claacuteusulaELSE RAISE CASE_NOT_FOUND

Si el CASE declaracioacuten selecciona el impliacutecito ELSE claacuteusula PL SQL plantea la excepcioacutenpredefinida CASE_NOT_FOUND Por lo tanto siempre hay una accioacuten predeterminada incluso cuandse omite el ELSE claacuteusula

Las palabras clave END CASE terminar el CASE comunicado Estas dos palabras clave deben estarseparadas por un espacio El CASE instruccioacuten tiene la forma siguiente

[ltltlabel_namegtgt]CASO selectorCUANDO ENTONCES expression1 sequence_of_statements1CUANDO ENTONCES sequence_of_statements2 expression2CUANDO ENTONCES expressionN sequence_of_statementsN[MAacuteS sequence_of_statementsN 1]CASO EXTREMO [LABEL_NAME]

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 619

Como bloques PL SQL CASE declaraciones pueden ser etiquetados La etiqueta un identificadono declarado cerrado entre pareacutentesis angulares dobles debe aparecer al principio dela CASE comunicadoOpcionalmente el nombre de la etiqueta tambieacuten puede aparecer al final dela CASE comunicado

Las excepciones planteadas durante la ejecucioacuten de un CASE declaracioacuten se manejan de la manerahabitual Es decir las paradas normales de ejecucioacuten y control se transfiere a la parte de control d

excepciones de PL SQL bloque o subprograma

Una alternativa a la CASE declaracioacuten es el CASE expresioacuten donde cada WHEN claacuteusula es unaexpresioacuten Para maacutes detalles consulte Expresiones CASE

CASE de buacutesqueda Declaracioacuten

PL SQL tambieacuten proporciona un buscado CASE declaracioacuten que tiene la forma

[ltltlabel_namegtgt]CASO

CUANDO ENTONCES search_condition1 sequence_of_statements1CUANDO ENTONCES search_condition2 sequence_of_statements2CUANDO ENTONCES search_conditionN sequence_of_statementsN[MAacuteS sequence_of_statementsN 1]CASO EXTREMO [LABEL_NAME]

La buacutesqueda CASE declaracioacuten no tiene selector Ademaacutes su WHEN claacuteusulas contienen lascondiciones de buacutesqueda que generan un valor booleano no expresiones que pueden producir unvalor de cualquier tipo Un ejemplo es el siguiente

CASOCUANDO grado = A dbms_outputput_line (Excelente)CUANDO grado = B THEN dbms_outputput_line (Muy Bueno)CUANDO grado = C THEN dbms_outputput_line (bueno)CUANDO grado = D THEN dbms_outputput_line (Fair)CUANDO grado = F THEN dbms_outputput_line (Pobre)ELSE dbms_outputput_line (No hay tal grado )END CASE

Las condiciones de buacutesqueda son evaluados de forma secuencial El valor booleano de cadacondicioacuten de buacutesqueda determina queacute WHEN claacuteusula se ejecuta Si una condicioacuten de buacutesqueda da

como resultado TRUE suWHEN claacuteusula se ejecuta Si alguna WHEN claacuteusula se ejecuta el control paa la siguiente instruccioacuten las condiciones de buacutesqueda para posteriores no son evaluados

Si ninguna de las condiciones de buacutesqueda da como resultado TRUE el ELSE se ejecuta laclaacuteusula El ELSE claacuteusula es opcional Sin embargo si se omite el ELSE claacuteusula PL SQL agreglo siguiente impliacutecita ELSEclaacuteusula

ELSE RAISE CASE_NOT_FOUND

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 719

Las excepciones planteadas durante la ejecucioacuten de una buacutesqueda CASE declaracioacuten se manejan dela manera habitual Es decir las paradas normales de ejecucioacuten y control se transfiere a la parte dcontrol de excepciones de PL SQL bloque o subprograma

Directrices para PL SQL Sentencias condicionales

Evite torpes IF declaraciones como las del siguiente ejemplo

SI minimum_balance saldo_nuevo ltENTONCESdescubierto = TRUEELSEdescubierto = falseEND IFSI descubierto = TRUE THENRAISE insufficient_fundsEND IF

Este coacutedigo no tiene en cuenta dos hechos uacutetiles En primer lugar el valor de una expresioacuten

booleana se pueden asignar directamente a una variable Boolean Por lo tanto puede reemplazar primera IF declaracioacuten con una simple asignacioacuten de la siguiente manera

descubierto = saldo_nuevo ltminimum_balance

En segundo lugar una variable booleana en siacute es verdadera o falsa Por lo tanto puede simplificala condicioacuten en la segunda IF declaracioacuten de la siguiente manera

SI ENTONCES descubierto

Cuando sea posible utilice el ELSIF claacuteusula en lugar de anidada IF declaraciones De esta manerel coacutedigo seraacute maacutes faacutecil de leer y entender Compare las siguientes IF declaraciones

SI ENTONCES condition1 | SI ENTONCES condition1sentencia1 | sentencia1ELSE | ELSIF condition2 ENTONCESSI ENTONCES condition2 | instruccioacuten2instruccioacuten2 | ELSIF Condition3 ENTONCESELSE | Sentencia3SI ENTONCES Condition3 | END IFSentencia3 |END IF |END IF |END IF |

Estas declaraciones son loacutegicamente equivalentes pero la primera declaracioacuten oscurece el flujo dla loacutegica mientras que la segunda declaracioacuten que revela

Si usted estaacute comparando una sola expresioacuten de varios valores se puede simplificar la loacutegicamediante el uso de un uacutenico CASE declaracioacuten en lugar de un IF con varios ELSIF claacuteusulas

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 819

Iterativo de control Las sentencias de bucle y EXIT

LOOP declaraciones permiten ejecutar una secuencia de instrucciones varias veces Hay tres formade LOOP declaraciones LOOP WHILE-LOOP y FOR-LOOP

LOOP

La forma maacutes simple de LOOP declaracioacuten es la base (o infinito) de bucle que incluye una secuencde sentencias entre las palabras clave LOOP y END LOOP como sigue

LOOPsequence_of_statementsEND LOOP

Con cada repeticioacuten del bucle la secuencia de instrucciones se ejecuta el control se reanuda en laparte superior del bucle Si el procesamiento adicional es indeseable o imposible puede utilizaruna EXIT declaracioacuten para completar el ciclo Usted puede colocar una o maacutes EXIT declaraciones e

cualquier lugar dentro de un bucle pero en ninguna parte fuera de un bucle Hay dos formasde EXIT declaraciones EXIT y EXIT-WHEN

SALIDA

La EXIT declaracioacuten fuerzas para completar un ciclo sin condiciones Cuando una EXIT se encuentla instruccioacuten el bucle finaliza inmediatamente y el control pasa a la siguiente instruccioacuten Unejemplo es el siguiente

LOOP

SI credit_rating lt3 entoncesEXIT - loop salir inmediatamenteEND IFEND LOOP- El control vuelve aquiacute

El siguiente ejemplo muestra que no se puede usar la EXIT declaracioacuten para completar un bloque SQL

COMENZAR

SI credit_rating lt3 entoncesEXIT - no se permiteEND IFEND

Recuerde la EXIT declaracioacuten debe ser colocado dentro de un bucle Para completar un bloque PLSQL antes de su finalizacioacuten normal se alcanza puede utilizar el RETURN comunicado Para maacutesinformacioacuten consulteUso de la instruccioacuten RETURN

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 919

EXIT-AL

El EXIT-WHEN declaracioacuten permite que un circuito completo de forma condicional Cuando la EXIT

encuentra la instruccioacuten la condicioacuten en la WHEN claacuteusula se evaluacutea Si la condicioacuten es verdadera ciclo se completa y el control pasa a la siguiente sentencia despueacutes del bucle Un ejemplo es elsiguiente

LOOPFETCH C1 EN SALIDA AL NOTFOUND c1 - bucle de salida si la condicioacuten es verdaderaEND LOOPCLOSE c1

Hasta que la condicioacuten es verdadera el bucle no se puede completar Por lo tanto una declaracioacutendentro del bucle debe cambiar el valor de la condicioacuten En el uacuteltimo ejemplo si el FETCH sentencidevuelve una fila la condicioacuten es falsa Cuando el FETCH declaracioacuten no devuelve una fila lacondicioacuten es verdadera el ciclo se completa y el control pasa a la CLOSE comunicado

El EXIT-WHEN declaracioacuten sustituye a un simple IF comunicado Por ejemplo compare las siguiendeclaraciones

Si el recuentogt 100 THEN | SALIDA CUANDO cuentagt 100EXIT |END IF |

Estas declaraciones son loacutegicamente equivalentes pero el EXIT-WHEN declaracioacuten es maacutes faacutecil deleer y entender

Etiquetas de bucle

Como bloques PL SQL loops pueden ser etiquetados La etiqueta un identificador no declaradocerrado entre pareacutentesis angulares dobles debe aparecer al principio de la LOOP declaracioacuten de lasiguiente manera

ltltlabel_namegtgtLOOPsequence_of_statementsEND LOOP

Opcionalmente el nombre de la etiqueta tambieacuten puede aparecer al final de la LOOP declaracioacutencomo muestra el siguiente ejemplo

ltltmy_loopgtgtLOOPEND LOOP my_loop

Al nidos marcados ciclos el uso final los nombres de etiqueta para mejorar la legibilidad

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1019

Con cualquier forma de EXIT declaracioacuten usted puede completar no soacutelo el lazo de corriente peroninguacuten lazo de inclusioacuten Simplemente la etiqueta del bucle encierra que desea completar Acontinuacioacuten utilice la etiqueta de una EXIT declaracioacuten de la siguiente manera

ltltoutergtgtLOOPLOOP

SALIDA exterior cuando - Salida de los dos buclesEND LOOPEND LOOP exterior

Cada adjuntando bucle hasta e incluyendo el bucle etiquetado se sale

Bucle while

El WHILE-LOOP socios la declaracioacuten de un estado con una secuencia de sentencias encerradas por

palabras clave LOOP y END LOOP como sigue

MIENTRAS condicioacuten de buclesequence_of_statementsEND LOOP

Antes de cada iteracioacuten del bucle se evaluacutea la condicioacuten Si la condicioacuten es verdadera la secuencde instrucciones se ejecuta el control se reanuda en la parte superior del bucle Si la condicioacuten esfalsa o nula el bucle se pasa por alto y el control pasa a la siguiente instruccioacuten Un ejemplo es elsiguiente

Mientras que el total lt= 25000 LOOPSELECCIONAR sal en el sueldo de EMP DONDE total = salario total +END LOOP

El nuacutemero de iteraciones depende de la condicioacuten y se desconoce hasta que el bucle termina Lacondicioacuten se comprueba en la parte superior del bucle por lo que la secuencia podriacutea ejecutar porcero En el uacuteltimo ejemplo si el valor inicial del total es mayor que 25000 la condicioacuten es falsael bucle se pasa por alto

Algunos idiomas tienen una LOOP UNTIL o REPEAT UNTIL estructura lo que prueba la condicioacuten en parte inferior del bucle en lugar de en la parte superior Por lo tanto la secuencia de instruccionesque se ejecuta al menos una vez PL SQL no tiene una estructura tal pero se puede construir unode la siguiente manera

LOOPsequence_of_statementsSALIDA AL boolean_expressionEND LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1119

Para asegurarse de que una WHILE bucle se ejecuta al menos una vez utilizar una variable Booleaninicializa en el estado de la siguiente manera

hecho = falseMIENTRAS NO hacer LOOPsequence_of_statementshecho = boolean_expressionEND LOOP

Una declaracioacuten dentro del bucle debe asignar un nuevo valor a la variable booleana De locontrario usted tiene un bucle infinito Por ejemplo el siguiente LOOP declaraciones sonloacutegicamente equivalentes

Bucle WHILE TRUE | LOOP | END LOOP | END LOOP

FOR-LOOP

Mientras que el nuacutemero de iteraciones a traveacutes de un WHILE bucle no se conoce hasta el bucletermina el nuacutemero de iteraciones a traveacutes de una FOR bucle se conoce antes de que el bucle seintroduce FOR bucles iterar a traveacutes de un rango especiacutefico de nuacutemeros enteros La gama es parteun esquema de iteracioacuten que estaacute rodeada por las palabras clave FOR y LOOP Un doble punto ( es el operador de rango La sintaxis es la siguiente

PARA contador en [atraacutes] lower_bound higher_bound LOOPsequence_of_statementsEND LOOP

La gama se evaluacutea cuando la FOR bucle se entroacute por primera vez y nunca volver a evaluarse

Como muestra el siguiente ejemplo la secuencia de instrucciones se ejecuta una vez para cadaentero en el rango Despueacutes de cada iteracioacuten el contador del bucle se incrementa

FOR i IN 1 3 LOOP - asignar los valores 123 para isequence_of_statements - ejecuta tres vecesEND LOOP

El siguiente ejemplo muestra que si el liacutemite inferior es igual a la mayor liacutemite la secuencia de

instrucciones se ejecuta una vez

FOR i IN 3 3 LOOP - asignar el valor 3 para isequence_of_statements - se ejecuta una vezEND LOOP

Por los ingresos por defecto la iteracioacuten hacia arriba de la cota inferior a los consolidados maacutesaltos Sin embargo como muestra el siguiente ejemplo si utiliza la palabra clave REVERSE proceiteracioacuten hacia abajo desde el alto obligado a la cota inferior Despueacutes de cada iteracioacuten el contad

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1219

del bucle se decrementa Sin embargo se escriben los liacutemites variacutean en orden ascendente (nodescendente)

FOR i IN REVERSE 1 3 LOOP - asignar los valores de 321 isequence_of_statements - ejecuta tres vecesEND LOOP

Dentro de una FOR bucle el contador del bucle se puede hacer referencia como una constante perno se puede asignar valores como muestra el siguiente ejemplo

PARA CTR en 1 10 LOOPSI NO ENTONCES terminadoINSERT INTO VALUES (ctr ) - legalfactor = ctr 2 - legalELSEctr = 10 - no se permiteEND IFEND LOOP

Esquemas de iteracioacuten

Los liacutemites de un rango de bucle puede ser literales variables o expresiones sino que debe evalua los nuacutemeros De lo contrario PL SQL lanza la excepcioacuten predefinida VALUE_ERROR El liacutemiteinferior no tiene que ser 1 como los ejemplos a continuacioacuten muestran Sin embargo el incremendel contador del bucle (o disminuir) debe ser 1

j EN -5 5k AL REVEacuteS primero uacuteltimapaso en 0 TRUNCAR (alto bajo) 2

Internamente PL SQL asigna los valores de los liacutemites temporales a PLS_INTEGER variables y sinecesario redondea los valores al entero maacutes cercano El rango de magnitud de un PLS_INTEGER ede -2 31 2 31 Por lo tanto si un liacutemite como resultado un nuacutemero fuera del rango seobtiene un error de desbordamiento numeacuterico cuando PL SQL los intentos de la asignacioacuten commuestra el siguiente ejemplo

DECLARENUacuteMERO hi = 2 32COMENZARPara j EN 1 LOOP hi - provoca un error de un desbordamiento numeacuterico

END LOOPEND

Algunos lenguajes proporcionan STEP claacuteusula que le permite especificar un incremento diferent(5 en vez de 1 por ejemplo) PL SQL no tiene una estructura tal pero se puede construiruno Dentro de la FOR bucle simplemente se multiplica cada referencia al contador del bucle por enuevo incremento En el siguiente ejemplo se asigna la fecha de hoy a los elementos de 5 10 y 1de un iacutendice por tabla

DECLARE

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1319

DateList TIPO ES LA MESA DEL IacuteNDICE DE FECHA POR BINARY_INTEGERfechas DateListINTEGER constante k = 5 - conjunto nuevo incrementoCOMENZARPara j EN 1 3 LOOPfechas (j k) = SYSDATE - se multiplican bucle contador incrementoEND LOOPEND

Rangos dinaacutemicos

PL SQL le permite determinar el rango de bucle de forma dinaacutemica en tiempo de ejecucioacuten commuestra el siguiente ejemplo

SELECT COUNT (empno) EN emp_count del EMPFOR i IN 1 LOOP emp_countEND LOOP

El valor de emp_count se desconoce en tiempo de compilacioacuten el SELECT instruccioacuten devuelve elvalor en tiempo de ejecucioacuten

iquestQueacute pasa si el liacutemite inferior de un rango de bucle evaluacutea a un entero mayor que el liacutemitesuperior Como muestra el siguiente ejemplo la secuencia de declaraciones dentro del bucle no sejecuta y el control pasa a la siguiente sentencia

- Liacutemite se convierte en unDE LOOP liacutemite i IN 2 sequence_of_statements - ejecuta cero vecesEND LOOP

- El control pasa aquiacute

Las reglas de aacutembito

El contador del bucle soacutelo se define dentro del bucle No se puede hacer referencia a eacutel fuera delbucle Despueacutes se sale del bucle el contador del bucle no estaacute definido como muestra el siguientejemplo

PARA CTR en 1 10 LOOPEND LOOPsuma = ctr - 1 - no se permite

Usted no necesita declarar expliacutecitamente el contador del bucle ya que se declara impliacutecitamentecomo una variable local de tipo INTEGER El siguiente ejemplo muestra que la declaracioacuten localoculta cualquier declaracioacuten global

DECLAREctr INTEGERCOMENZARPARA CTR en 1 25 LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1419

Si Ctrgt 10 THEN - Se refiere al contador del bucleEND LOOPEND

Para hacer referencia a la variable global en este ejemplo debe utilizar una etiqueta y la notacioacutenpuntos como sigue

ltltmaingtgtDECLAREctr INTEGERCOMENZARPARA CTR en 1 25 LOOPSI mainctrgt 10 THEN - se refiere a la variable globalEND IFEND LOOPEND principal

Las reglas del aacutembito mismo se aplica a anidar FOR bucles Considere el siguiente ejemplo Ambocontadores de bucles con el mismo nombre Por lo tanto para hacer referencia al contador del buexterno del bucle interno debe utilizar una etiqueta y la notacioacuten de puntos como sigue

ltltoutergtgtPara el paso en 1 25 LOOPPara el paso en 1 10 LOOPSI outerstepgt 15 ENTONCES END LOOP

END LOOP exterior

Utilizando la sentencia EXIT

La EXIT declaracioacuten permite una FOR vuelta completa antes de tiempo Por ejemplo el siguientebucle se ejecuta normalmente diez veces pero tan pronto como el FETCH declaracioacuten no devuelveuna fila el ciclo se completa no importa cuaacutentas veces se ha ejecutado

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA AL NOTFOUND c1

END LOOP

Suponga que usted debe salir de un anidados FOR bucle antes de tiempo Puede completar no soacutelolazo de corriente pero ninguacuten lazo de inclusioacuten Simplemente la etiqueta del bucle encierra quedesea completar A continuacioacuten utilice la etiqueta de una EXIT declaracioacuten para especificarqueacute FOR bucle de salida de la siguiente manera

ltltoutergtgtFOR i IN 1 5 LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1519

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA exterior cuando NOTFOUND c1 - salida tanto para los buclesEND LOOPEND LOOP exterior- El control pasa aquiacute

Secuencial de control GOTO y declaraciones NULL

A diferencia de la IF y LOOP declaraciones el GOTO y NULL declaraciones no son cruciales para PL SQL de programacioacuten La estructura de PL SQL es tal que el GOTO declaracioacuten es rara veznecesario De vez en cuando se puede simplificar la loacutegica suficiente como para justificar suuso La NULL declaracioacuten puede mejorar la legibilidad al hacer que el significado y la accioacuten de lasentencias condicionales claro

El uso excesivo de GOTO declaraciones puede generar un coacutedigo complejo no estructurada (a vecellamado spaghetti coacutedigo) que es difiacutecil de entender y mantener Por lo tanto el

uso GOTO declaraciones con moderacioacuten Por ejemplo para poder partir de una estructura anidadauna rutina de control de errores una excepcioacuten en lugar de utilizar un GOTO comunicado

GoTo

El GOTO ramas declaracioacuten a una etiqueta de manera incondicional La etiqueta debe ser uacutenico en alcance y debe preceder a una sentencia ejecutable o un bloque PL SQL Cuando se ejecutael GOTO transfiere el informe de control a la sentencia etiquetada o del bloque En el siguienteejemplo usted va a una sentencia ejecutable maacutes abajo en una secuencia de instrucciones

COMENZARGOTO insert_rowltltinsert_rowgtgtINSERT INTO VALORES emp END

En el siguiente ejemplo usted va a un bloque PL SQL maacutes arriba en una secuencia deinstrucciones

COMENZARltltupdate_rowgtgtCOMENZARACTUALIZACIOacuteN eacutenfasis JUEGO ENDGOTO update_rowEND

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1619

La etiqueta end_loop en el siguiente ejemplo no estaacute permitido porque no precede a una sentenciaejecutable

DECLAREhace booleanCOMENZARFOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgt - No se permiteEND LOOP - no es una sentencia ejecutableEND

Para depurar el uacuteltimo ejemplo soacutelo tiene que antildeadir el NULL declaracioacuten de la siguiente manera

FOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgtNULL - una sentencia ejecutableEND LOOP

Como muestra el siguiente ejemplo un GOTO declaracioacuten puede rama de un bloque que lo contiendesde el bloque actual

DECLAREmy_ename CHAR (10)COMENZARltltget_namegtgtSELECCIONAR Ename EN my_ename de EMP DONDE COMENZARObtiene_nombre GOTO - rama adjuntando bloqueENDEND

El GOTO ramas declaracioacuten al primer bloque encierra en el que la etiqueta se hace referencia apare

Restricciones

Algunos de los destinos posibles de un GOTO declaracioacuten no se permite En concretoun GOTO declaracioacuten no puede bifurcarse en un IF declaracioacuten CASE declaracioacuten LOOP declaracioacutensub-bloque Por ejemplo la siguiente GOTO declaracioacuten no se permite

COMENZARGOTO update_row - no se ramifican en IFSI ENTONCES vaacutelida

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1719

ltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

Como muestra el siguiente ejemplo un GOTO declaracioacuten no puede rama de un IF claacuteusula dedeclaracioacuten a otra Del mismo modo un GOTO declaracioacuten no puede rama deun CASE declaracioacuten WHEN claacuteusula a otra

COMENZARSI ENTONCES vaacutelidaGOTO update_row - no se ramifican en la claacuteusula ELSEELSEltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

El siguiente ejemplo muestra que un GOTO declaracioacuten no puede rama de un bloque que lo contienen un sub-bloque

COMENZARSi el estado = obsoletos THENGOTO delete_part - no se ramifican en sub-bloqueEND IFCOMENZAR

ltltdelete_partgtgtCANCELACIOacuteN de piezas en las ENDEND

Ademaacutes un GOTO declaracioacuten no puede ramificar hacia fuera de un subprograma como muestra esiguiente ejemplo

DECLARE

PROCEDIMIENTO compute_bonus (NUacuteMERO emp_id) ESCOMENZARGOTO update_row - no se puede ramificar hacia fuera del subprogramaENDCOMENZARltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1819

Por uacuteltimo un GOTO declaracioacuten no puede rama de un manejador de excepcioacuten en el bloqueactual Por ejemplo la siguiente GOTO declaracioacuten no se permite

DECLAREpe_ratio REALCOMENZARSelecciona el precio NVL (ingresos 0) en pe_ratio DE

ltltinsert_rowgtgtINSERT INTO VALORES Estadiacutesticas (pe_ratio )EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEpe_ratio = 0GOTO insert_row - no se puede poder en el bloque actualEND

Sin embargo un GOTO declaracioacuten puede rama de un manejador de excepciones en un bloque que contiene

Declaracioacuten de NULL

La NULL declaracioacuten no hace otra cosa que el control pase a la siguiente instruccioacuten En unconstructor condicional el NULL declaracioacuten dice a los lectores la posibilidad de que se haconsiderado pero no hay accioacuten que sea necesaria En el siguiente ejemplo el NULL declaracioacutendemuestra que no se toman medidas de excepcioacuten sin nombre

EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEROLLBACKCUANDO ENTONCES VALUE_ERROR

INSERT INTO VALORES errores COMMITCUANDO OTROS ENTONCESNULLEND

En IF las declaraciones u otros lugares que requieren por lo menos una sentencia ejecutableel NULL declaracioacuten para satisfacer a la sintaxis En el siguiente ejemplo el NULL declaracioacuten hacehincapieacute en que soacutelo los mejores empleados reciban bonificaciones

Si la calificacioacutengt 90 THEN

compute_bonus (emp_id)ELSENULLEND IF

Ademaacutes el NULL declaracioacuten es una forma praacutectica para crear recibos de la hora de disentildearaplicaciones de arriba hacia abajo Un taloacuten se subprograma ficticio que le permite diferir ladefinicioacuten de un procedimiento o funcioacuten hasta que probar y depurar el programa principal En elsiguiente ejemplo el NULL declaracioacuten cumple con el requisito de que al menos una declaracioacutendebe aparecer en la parte ejecutable de un subprograma

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1919

PROCEDIMIENTO debit_account (acct_id INTEGER REAL cantidad) ESCOMENZARNULLEND debit_account

Copyright copy 1996 2002 Oracle Corporation Todos los derechos reservados

Casa

Lista delibros

Contenido

Iacutendice

MasterIndex

Realiment

Page 3: programacion oracle

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 319

Si xgt vuelve a subir y = x END IF

IF-Then-Else

La segunda forma de IF sentencia antildeade la palabra clave ELSE seguido por una secuencia alternatide los estados de la siguiente manera

IF condicioacuten THEN

sequence_of_statements1ELSEsequence_of_statements2END IF

La secuencia de declaraciones en el ELSE claacuteusula soacutelo se ejecuta si la condicioacuten es falsa o nula Plo tanto el ELSE claacuteusula garantiza que una secuencia de sentencias se ejecuta En el siguienteejemplo el primer UPDATEsentencia se ejecuta cuando la condicioacuten es verdadera pero lasegunda UPDATE sentencia se ejecuta cuando la condicioacuten es falsa o nula

SI trans_type = CR THENUPDATE cuentas SET saldo = saldo + de creacutedito en ELSEUPDATE cuentas SET saldo = saldo - deacutebito DONDE END IF

El THEN y ELSE pueden incluir claacuteusulas IF declaraciones Es decir IF declaraciones se puedenanidar como muestra el siguiente ejemplo

SI trans_type = CR THENUPDATE cuentas SET saldo = saldo + de creacutedito en ELSESI saldo_nuevogt = minimum_balance ENTONCESUPDATE cuentas SET saldo = saldo - deacutebito DONDE ELSERAISE insufficient_fundsEND IFEND IF

IF-THEN-ELSIF Declaracioacuten

A veces usted desee seleccionar una accioacuten de varias alternativas mutuamente excluyentes Latercera forma de IF instruccioacuten utiliza la palabra clave ELSIF (no ELSEIF ) para introducir

condiciones adicionales como sigueSI ENTONCES condition1sequence_of_statements1ELSIF condition2 ENTONCESsequence_of_statements2ELSEsequence_of_statements3END IF

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 419

Si la primera condicioacuten es falsa o nula el ELSIF claacuteusula de las pruebas de otracondicioacuten Un IF declaracioacuten puede tener cualquier nuacutemero de ELSIF claacuteusulas lafinal ELSE claacuteusula es opcional Las condiciones son evaluadas una por una de arriba abajo Sicualquier condicioacuten es verdadera su secuencia de estados asociados se ejecuta y el control pasa asiguiente instruccioacuten Si todas las condiciones son falsas o nulo la secuencia en el ELSE se ejecutala claacuteusula Consideremos el siguiente ejemplo

COMENZARSi las ventasgt 50000 THENbono = 1500ELSIF ventasgt 35000 THENbono = 500ELSEbono = 100END IFINSERT INTO VALORES noacutemina (emp_id bonus )END

Si el valor de sales es mayor que 50000 la primera y segunda condicioacuten son verdaderas Sinembargo bonus se le asigna el valor apropiado de 1500 debido a que la segunda condicioacuten no se hprobado Cuando la primera condicioacuten es verdadera la sentencia asociada se ejecuta y el controlpasa a la INSERT comunicado

CASE

Al igual que el IF declaracioacuten el CASE declaracioacuten selecciona una secuencia de comandos que seejecutan Sin embargo para seleccionar la secuencia el CASE instruccioacuten utiliza un selector en lugde muacuteltiples expresiones booleanas (Recuerde que en el capiacutetulo 2 que el selector es una expresi

cuyo valor se utiliza para seleccionar una de varias alternativas) Para compararel IF y CASE declaraciones considere el siguiente coacutedigo que las salidas de las descripciones de logrados de la escuela

SI = grado Adbms_outputput_line (Excelente)ELSIF grado = B THENdbms_outputput_line (Muy Bueno)ELSIF grado = C THENdbms_outputput_line (bueno)ELSIF grado = D THENDBMS_OUTPUT put_line (Fair)ELSIF grado = F THENdbms_outputput_line (Pobre)ELSEdbms_outputput_line (No hay tal grado )END IF

Aviso de los cinco expresiones booleanas En cada caso comprobamos si la mismavariable grade es igual a uno de los cinco valores A B C D o F Vamos a reescribel coacutedigo anterior con el CASEdeclaracioacuten de la siguiente manera

CASO grado

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 519

CUANDO A dbms_outputput_line (Excelente)Cuando B THEN dbms_outputput_line (Muy Bueno)Cuando C THEN dbms_outputput_line (bueno)Cuando el entonces D dbms_outputput_line (Fair)CUANDO F THEN dbms_outputput_line (Pobre)ELSE dbms_outputput_line (No hay tal grado )END CASE

El CASE declaracioacuten es maacutes legible y maacutes eficiente Por lo tanto cuando sea posible vuelva aescribir largas IF-THEN-ELSIF declaraciones como CASE declaraciones

El CASE declaracioacuten comienza con la palabra clave CASE La palabra clave es seguido por unselector que es la variable grade en el uacuteltimo ejemplo La expresioacuten selector puede serarbitrariamente compleja Por ejemplo puede contener llamadas a funciones Por lo general sinembargo se trata de una sola variable La expresioacuten selector se evaluacutea soacutelo una vez Losrendimientos de los que valor puede tener cualquier tipo de datos PL SQL que no BLOB BFILE tipo de objeto un registro PL SQL un iacutendice por tabla VARRAY o una tabla anidada

El selector es seguido por uno o maacutes WHEN claacuteusulas que se comprueban de forma secuencial Elvalor de la claacuteusula de seleccioacuten determina que se ejecuta Si el valor del selector es igual al valorde un WHEN expresioacuten claacuteusula que WHEN claacuteusula se ejecuta Por ejemplo en el uacuteltimo ejemplosi grade es igual a C el programa de salidas de Good Nunca cae a traveacutes de la ejecucioacuten en caso WHEN claacuteusula se ejecuta el control pasa a la siguiente instruccioacuten

El ELSE claacuteusula funciona de manera similar a la ELSE claacuteusula de un IF comunicado En el uacuteltimoejemplo si la calificacioacuten no es una de las opciones cubiertas por una WHEN claacuteusulael ELSE claacuteusula se ha seleccionado y la frase No such grade es la salida El ELSE claacuteusula esopcional Sin embargo si se omite el ELSE claacuteusula PL SQL agrega lo siguiente

impliacutecita ELSE claacuteusulaELSE RAISE CASE_NOT_FOUND

Si el CASE declaracioacuten selecciona el impliacutecito ELSE claacuteusula PL SQL plantea la excepcioacutenpredefinida CASE_NOT_FOUND Por lo tanto siempre hay una accioacuten predeterminada incluso cuandse omite el ELSE claacuteusula

Las palabras clave END CASE terminar el CASE comunicado Estas dos palabras clave deben estarseparadas por un espacio El CASE instruccioacuten tiene la forma siguiente

[ltltlabel_namegtgt]CASO selectorCUANDO ENTONCES expression1 sequence_of_statements1CUANDO ENTONCES sequence_of_statements2 expression2CUANDO ENTONCES expressionN sequence_of_statementsN[MAacuteS sequence_of_statementsN 1]CASO EXTREMO [LABEL_NAME]

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 619

Como bloques PL SQL CASE declaraciones pueden ser etiquetados La etiqueta un identificadono declarado cerrado entre pareacutentesis angulares dobles debe aparecer al principio dela CASE comunicadoOpcionalmente el nombre de la etiqueta tambieacuten puede aparecer al final dela CASE comunicado

Las excepciones planteadas durante la ejecucioacuten de un CASE declaracioacuten se manejan de la manerahabitual Es decir las paradas normales de ejecucioacuten y control se transfiere a la parte de control d

excepciones de PL SQL bloque o subprograma

Una alternativa a la CASE declaracioacuten es el CASE expresioacuten donde cada WHEN claacuteusula es unaexpresioacuten Para maacutes detalles consulte Expresiones CASE

CASE de buacutesqueda Declaracioacuten

PL SQL tambieacuten proporciona un buscado CASE declaracioacuten que tiene la forma

[ltltlabel_namegtgt]CASO

CUANDO ENTONCES search_condition1 sequence_of_statements1CUANDO ENTONCES search_condition2 sequence_of_statements2CUANDO ENTONCES search_conditionN sequence_of_statementsN[MAacuteS sequence_of_statementsN 1]CASO EXTREMO [LABEL_NAME]

La buacutesqueda CASE declaracioacuten no tiene selector Ademaacutes su WHEN claacuteusulas contienen lascondiciones de buacutesqueda que generan un valor booleano no expresiones que pueden producir unvalor de cualquier tipo Un ejemplo es el siguiente

CASOCUANDO grado = A dbms_outputput_line (Excelente)CUANDO grado = B THEN dbms_outputput_line (Muy Bueno)CUANDO grado = C THEN dbms_outputput_line (bueno)CUANDO grado = D THEN dbms_outputput_line (Fair)CUANDO grado = F THEN dbms_outputput_line (Pobre)ELSE dbms_outputput_line (No hay tal grado )END CASE

Las condiciones de buacutesqueda son evaluados de forma secuencial El valor booleano de cadacondicioacuten de buacutesqueda determina queacute WHEN claacuteusula se ejecuta Si una condicioacuten de buacutesqueda da

como resultado TRUE suWHEN claacuteusula se ejecuta Si alguna WHEN claacuteusula se ejecuta el control paa la siguiente instruccioacuten las condiciones de buacutesqueda para posteriores no son evaluados

Si ninguna de las condiciones de buacutesqueda da como resultado TRUE el ELSE se ejecuta laclaacuteusula El ELSE claacuteusula es opcional Sin embargo si se omite el ELSE claacuteusula PL SQL agreglo siguiente impliacutecita ELSEclaacuteusula

ELSE RAISE CASE_NOT_FOUND

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 719

Las excepciones planteadas durante la ejecucioacuten de una buacutesqueda CASE declaracioacuten se manejan dela manera habitual Es decir las paradas normales de ejecucioacuten y control se transfiere a la parte dcontrol de excepciones de PL SQL bloque o subprograma

Directrices para PL SQL Sentencias condicionales

Evite torpes IF declaraciones como las del siguiente ejemplo

SI minimum_balance saldo_nuevo ltENTONCESdescubierto = TRUEELSEdescubierto = falseEND IFSI descubierto = TRUE THENRAISE insufficient_fundsEND IF

Este coacutedigo no tiene en cuenta dos hechos uacutetiles En primer lugar el valor de una expresioacuten

booleana se pueden asignar directamente a una variable Boolean Por lo tanto puede reemplazar primera IF declaracioacuten con una simple asignacioacuten de la siguiente manera

descubierto = saldo_nuevo ltminimum_balance

En segundo lugar una variable booleana en siacute es verdadera o falsa Por lo tanto puede simplificala condicioacuten en la segunda IF declaracioacuten de la siguiente manera

SI ENTONCES descubierto

Cuando sea posible utilice el ELSIF claacuteusula en lugar de anidada IF declaraciones De esta manerel coacutedigo seraacute maacutes faacutecil de leer y entender Compare las siguientes IF declaraciones

SI ENTONCES condition1 | SI ENTONCES condition1sentencia1 | sentencia1ELSE | ELSIF condition2 ENTONCESSI ENTONCES condition2 | instruccioacuten2instruccioacuten2 | ELSIF Condition3 ENTONCESELSE | Sentencia3SI ENTONCES Condition3 | END IFSentencia3 |END IF |END IF |END IF |

Estas declaraciones son loacutegicamente equivalentes pero la primera declaracioacuten oscurece el flujo dla loacutegica mientras que la segunda declaracioacuten que revela

Si usted estaacute comparando una sola expresioacuten de varios valores se puede simplificar la loacutegicamediante el uso de un uacutenico CASE declaracioacuten en lugar de un IF con varios ELSIF claacuteusulas

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 819

Iterativo de control Las sentencias de bucle y EXIT

LOOP declaraciones permiten ejecutar una secuencia de instrucciones varias veces Hay tres formade LOOP declaraciones LOOP WHILE-LOOP y FOR-LOOP

LOOP

La forma maacutes simple de LOOP declaracioacuten es la base (o infinito) de bucle que incluye una secuencde sentencias entre las palabras clave LOOP y END LOOP como sigue

LOOPsequence_of_statementsEND LOOP

Con cada repeticioacuten del bucle la secuencia de instrucciones se ejecuta el control se reanuda en laparte superior del bucle Si el procesamiento adicional es indeseable o imposible puede utilizaruna EXIT declaracioacuten para completar el ciclo Usted puede colocar una o maacutes EXIT declaraciones e

cualquier lugar dentro de un bucle pero en ninguna parte fuera de un bucle Hay dos formasde EXIT declaraciones EXIT y EXIT-WHEN

SALIDA

La EXIT declaracioacuten fuerzas para completar un ciclo sin condiciones Cuando una EXIT se encuentla instruccioacuten el bucle finaliza inmediatamente y el control pasa a la siguiente instruccioacuten Unejemplo es el siguiente

LOOP

SI credit_rating lt3 entoncesEXIT - loop salir inmediatamenteEND IFEND LOOP- El control vuelve aquiacute

El siguiente ejemplo muestra que no se puede usar la EXIT declaracioacuten para completar un bloque SQL

COMENZAR

SI credit_rating lt3 entoncesEXIT - no se permiteEND IFEND

Recuerde la EXIT declaracioacuten debe ser colocado dentro de un bucle Para completar un bloque PLSQL antes de su finalizacioacuten normal se alcanza puede utilizar el RETURN comunicado Para maacutesinformacioacuten consulteUso de la instruccioacuten RETURN

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 919

EXIT-AL

El EXIT-WHEN declaracioacuten permite que un circuito completo de forma condicional Cuando la EXIT

encuentra la instruccioacuten la condicioacuten en la WHEN claacuteusula se evaluacutea Si la condicioacuten es verdadera ciclo se completa y el control pasa a la siguiente sentencia despueacutes del bucle Un ejemplo es elsiguiente

LOOPFETCH C1 EN SALIDA AL NOTFOUND c1 - bucle de salida si la condicioacuten es verdaderaEND LOOPCLOSE c1

Hasta que la condicioacuten es verdadera el bucle no se puede completar Por lo tanto una declaracioacutendentro del bucle debe cambiar el valor de la condicioacuten En el uacuteltimo ejemplo si el FETCH sentencidevuelve una fila la condicioacuten es falsa Cuando el FETCH declaracioacuten no devuelve una fila lacondicioacuten es verdadera el ciclo se completa y el control pasa a la CLOSE comunicado

El EXIT-WHEN declaracioacuten sustituye a un simple IF comunicado Por ejemplo compare las siguiendeclaraciones

Si el recuentogt 100 THEN | SALIDA CUANDO cuentagt 100EXIT |END IF |

Estas declaraciones son loacutegicamente equivalentes pero el EXIT-WHEN declaracioacuten es maacutes faacutecil deleer y entender

Etiquetas de bucle

Como bloques PL SQL loops pueden ser etiquetados La etiqueta un identificador no declaradocerrado entre pareacutentesis angulares dobles debe aparecer al principio de la LOOP declaracioacuten de lasiguiente manera

ltltlabel_namegtgtLOOPsequence_of_statementsEND LOOP

Opcionalmente el nombre de la etiqueta tambieacuten puede aparecer al final de la LOOP declaracioacutencomo muestra el siguiente ejemplo

ltltmy_loopgtgtLOOPEND LOOP my_loop

Al nidos marcados ciclos el uso final los nombres de etiqueta para mejorar la legibilidad

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1019

Con cualquier forma de EXIT declaracioacuten usted puede completar no soacutelo el lazo de corriente peroninguacuten lazo de inclusioacuten Simplemente la etiqueta del bucle encierra que desea completar Acontinuacioacuten utilice la etiqueta de una EXIT declaracioacuten de la siguiente manera

ltltoutergtgtLOOPLOOP

SALIDA exterior cuando - Salida de los dos buclesEND LOOPEND LOOP exterior

Cada adjuntando bucle hasta e incluyendo el bucle etiquetado se sale

Bucle while

El WHILE-LOOP socios la declaracioacuten de un estado con una secuencia de sentencias encerradas por

palabras clave LOOP y END LOOP como sigue

MIENTRAS condicioacuten de buclesequence_of_statementsEND LOOP

Antes de cada iteracioacuten del bucle se evaluacutea la condicioacuten Si la condicioacuten es verdadera la secuencde instrucciones se ejecuta el control se reanuda en la parte superior del bucle Si la condicioacuten esfalsa o nula el bucle se pasa por alto y el control pasa a la siguiente instruccioacuten Un ejemplo es elsiguiente

Mientras que el total lt= 25000 LOOPSELECCIONAR sal en el sueldo de EMP DONDE total = salario total +END LOOP

El nuacutemero de iteraciones depende de la condicioacuten y se desconoce hasta que el bucle termina Lacondicioacuten se comprueba en la parte superior del bucle por lo que la secuencia podriacutea ejecutar porcero En el uacuteltimo ejemplo si el valor inicial del total es mayor que 25000 la condicioacuten es falsael bucle se pasa por alto

Algunos idiomas tienen una LOOP UNTIL o REPEAT UNTIL estructura lo que prueba la condicioacuten en parte inferior del bucle en lugar de en la parte superior Por lo tanto la secuencia de instruccionesque se ejecuta al menos una vez PL SQL no tiene una estructura tal pero se puede construir unode la siguiente manera

LOOPsequence_of_statementsSALIDA AL boolean_expressionEND LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1119

Para asegurarse de que una WHILE bucle se ejecuta al menos una vez utilizar una variable Booleaninicializa en el estado de la siguiente manera

hecho = falseMIENTRAS NO hacer LOOPsequence_of_statementshecho = boolean_expressionEND LOOP

Una declaracioacuten dentro del bucle debe asignar un nuevo valor a la variable booleana De locontrario usted tiene un bucle infinito Por ejemplo el siguiente LOOP declaraciones sonloacutegicamente equivalentes

Bucle WHILE TRUE | LOOP | END LOOP | END LOOP

FOR-LOOP

Mientras que el nuacutemero de iteraciones a traveacutes de un WHILE bucle no se conoce hasta el bucletermina el nuacutemero de iteraciones a traveacutes de una FOR bucle se conoce antes de que el bucle seintroduce FOR bucles iterar a traveacutes de un rango especiacutefico de nuacutemeros enteros La gama es parteun esquema de iteracioacuten que estaacute rodeada por las palabras clave FOR y LOOP Un doble punto ( es el operador de rango La sintaxis es la siguiente

PARA contador en [atraacutes] lower_bound higher_bound LOOPsequence_of_statementsEND LOOP

La gama se evaluacutea cuando la FOR bucle se entroacute por primera vez y nunca volver a evaluarse

Como muestra el siguiente ejemplo la secuencia de instrucciones se ejecuta una vez para cadaentero en el rango Despueacutes de cada iteracioacuten el contador del bucle se incrementa

FOR i IN 1 3 LOOP - asignar los valores 123 para isequence_of_statements - ejecuta tres vecesEND LOOP

El siguiente ejemplo muestra que si el liacutemite inferior es igual a la mayor liacutemite la secuencia de

instrucciones se ejecuta una vez

FOR i IN 3 3 LOOP - asignar el valor 3 para isequence_of_statements - se ejecuta una vezEND LOOP

Por los ingresos por defecto la iteracioacuten hacia arriba de la cota inferior a los consolidados maacutesaltos Sin embargo como muestra el siguiente ejemplo si utiliza la palabra clave REVERSE proceiteracioacuten hacia abajo desde el alto obligado a la cota inferior Despueacutes de cada iteracioacuten el contad

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1219

del bucle se decrementa Sin embargo se escriben los liacutemites variacutean en orden ascendente (nodescendente)

FOR i IN REVERSE 1 3 LOOP - asignar los valores de 321 isequence_of_statements - ejecuta tres vecesEND LOOP

Dentro de una FOR bucle el contador del bucle se puede hacer referencia como una constante perno se puede asignar valores como muestra el siguiente ejemplo

PARA CTR en 1 10 LOOPSI NO ENTONCES terminadoINSERT INTO VALUES (ctr ) - legalfactor = ctr 2 - legalELSEctr = 10 - no se permiteEND IFEND LOOP

Esquemas de iteracioacuten

Los liacutemites de un rango de bucle puede ser literales variables o expresiones sino que debe evalua los nuacutemeros De lo contrario PL SQL lanza la excepcioacuten predefinida VALUE_ERROR El liacutemiteinferior no tiene que ser 1 como los ejemplos a continuacioacuten muestran Sin embargo el incremendel contador del bucle (o disminuir) debe ser 1

j EN -5 5k AL REVEacuteS primero uacuteltimapaso en 0 TRUNCAR (alto bajo) 2

Internamente PL SQL asigna los valores de los liacutemites temporales a PLS_INTEGER variables y sinecesario redondea los valores al entero maacutes cercano El rango de magnitud de un PLS_INTEGER ede -2 31 2 31 Por lo tanto si un liacutemite como resultado un nuacutemero fuera del rango seobtiene un error de desbordamiento numeacuterico cuando PL SQL los intentos de la asignacioacuten commuestra el siguiente ejemplo

DECLARENUacuteMERO hi = 2 32COMENZARPara j EN 1 LOOP hi - provoca un error de un desbordamiento numeacuterico

END LOOPEND

Algunos lenguajes proporcionan STEP claacuteusula que le permite especificar un incremento diferent(5 en vez de 1 por ejemplo) PL SQL no tiene una estructura tal pero se puede construiruno Dentro de la FOR bucle simplemente se multiplica cada referencia al contador del bucle por enuevo incremento En el siguiente ejemplo se asigna la fecha de hoy a los elementos de 5 10 y 1de un iacutendice por tabla

DECLARE

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1319

DateList TIPO ES LA MESA DEL IacuteNDICE DE FECHA POR BINARY_INTEGERfechas DateListINTEGER constante k = 5 - conjunto nuevo incrementoCOMENZARPara j EN 1 3 LOOPfechas (j k) = SYSDATE - se multiplican bucle contador incrementoEND LOOPEND

Rangos dinaacutemicos

PL SQL le permite determinar el rango de bucle de forma dinaacutemica en tiempo de ejecucioacuten commuestra el siguiente ejemplo

SELECT COUNT (empno) EN emp_count del EMPFOR i IN 1 LOOP emp_countEND LOOP

El valor de emp_count se desconoce en tiempo de compilacioacuten el SELECT instruccioacuten devuelve elvalor en tiempo de ejecucioacuten

iquestQueacute pasa si el liacutemite inferior de un rango de bucle evaluacutea a un entero mayor que el liacutemitesuperior Como muestra el siguiente ejemplo la secuencia de declaraciones dentro del bucle no sejecuta y el control pasa a la siguiente sentencia

- Liacutemite se convierte en unDE LOOP liacutemite i IN 2 sequence_of_statements - ejecuta cero vecesEND LOOP

- El control pasa aquiacute

Las reglas de aacutembito

El contador del bucle soacutelo se define dentro del bucle No se puede hacer referencia a eacutel fuera delbucle Despueacutes se sale del bucle el contador del bucle no estaacute definido como muestra el siguientejemplo

PARA CTR en 1 10 LOOPEND LOOPsuma = ctr - 1 - no se permite

Usted no necesita declarar expliacutecitamente el contador del bucle ya que se declara impliacutecitamentecomo una variable local de tipo INTEGER El siguiente ejemplo muestra que la declaracioacuten localoculta cualquier declaracioacuten global

DECLAREctr INTEGERCOMENZARPARA CTR en 1 25 LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1419

Si Ctrgt 10 THEN - Se refiere al contador del bucleEND LOOPEND

Para hacer referencia a la variable global en este ejemplo debe utilizar una etiqueta y la notacioacutenpuntos como sigue

ltltmaingtgtDECLAREctr INTEGERCOMENZARPARA CTR en 1 25 LOOPSI mainctrgt 10 THEN - se refiere a la variable globalEND IFEND LOOPEND principal

Las reglas del aacutembito mismo se aplica a anidar FOR bucles Considere el siguiente ejemplo Ambocontadores de bucles con el mismo nombre Por lo tanto para hacer referencia al contador del buexterno del bucle interno debe utilizar una etiqueta y la notacioacuten de puntos como sigue

ltltoutergtgtPara el paso en 1 25 LOOPPara el paso en 1 10 LOOPSI outerstepgt 15 ENTONCES END LOOP

END LOOP exterior

Utilizando la sentencia EXIT

La EXIT declaracioacuten permite una FOR vuelta completa antes de tiempo Por ejemplo el siguientebucle se ejecuta normalmente diez veces pero tan pronto como el FETCH declaracioacuten no devuelveuna fila el ciclo se completa no importa cuaacutentas veces se ha ejecutado

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA AL NOTFOUND c1

END LOOP

Suponga que usted debe salir de un anidados FOR bucle antes de tiempo Puede completar no soacutelolazo de corriente pero ninguacuten lazo de inclusioacuten Simplemente la etiqueta del bucle encierra quedesea completar A continuacioacuten utilice la etiqueta de una EXIT declaracioacuten para especificarqueacute FOR bucle de salida de la siguiente manera

ltltoutergtgtFOR i IN 1 5 LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1519

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA exterior cuando NOTFOUND c1 - salida tanto para los buclesEND LOOPEND LOOP exterior- El control pasa aquiacute

Secuencial de control GOTO y declaraciones NULL

A diferencia de la IF y LOOP declaraciones el GOTO y NULL declaraciones no son cruciales para PL SQL de programacioacuten La estructura de PL SQL es tal que el GOTO declaracioacuten es rara veznecesario De vez en cuando se puede simplificar la loacutegica suficiente como para justificar suuso La NULL declaracioacuten puede mejorar la legibilidad al hacer que el significado y la accioacuten de lasentencias condicionales claro

El uso excesivo de GOTO declaraciones puede generar un coacutedigo complejo no estructurada (a vecellamado spaghetti coacutedigo) que es difiacutecil de entender y mantener Por lo tanto el

uso GOTO declaraciones con moderacioacuten Por ejemplo para poder partir de una estructura anidadauna rutina de control de errores una excepcioacuten en lugar de utilizar un GOTO comunicado

GoTo

El GOTO ramas declaracioacuten a una etiqueta de manera incondicional La etiqueta debe ser uacutenico en alcance y debe preceder a una sentencia ejecutable o un bloque PL SQL Cuando se ejecutael GOTO transfiere el informe de control a la sentencia etiquetada o del bloque En el siguienteejemplo usted va a una sentencia ejecutable maacutes abajo en una secuencia de instrucciones

COMENZARGOTO insert_rowltltinsert_rowgtgtINSERT INTO VALORES emp END

En el siguiente ejemplo usted va a un bloque PL SQL maacutes arriba en una secuencia deinstrucciones

COMENZARltltupdate_rowgtgtCOMENZARACTUALIZACIOacuteN eacutenfasis JUEGO ENDGOTO update_rowEND

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1619

La etiqueta end_loop en el siguiente ejemplo no estaacute permitido porque no precede a una sentenciaejecutable

DECLAREhace booleanCOMENZARFOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgt - No se permiteEND LOOP - no es una sentencia ejecutableEND

Para depurar el uacuteltimo ejemplo soacutelo tiene que antildeadir el NULL declaracioacuten de la siguiente manera

FOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgtNULL - una sentencia ejecutableEND LOOP

Como muestra el siguiente ejemplo un GOTO declaracioacuten puede rama de un bloque que lo contiendesde el bloque actual

DECLAREmy_ename CHAR (10)COMENZARltltget_namegtgtSELECCIONAR Ename EN my_ename de EMP DONDE COMENZARObtiene_nombre GOTO - rama adjuntando bloqueENDEND

El GOTO ramas declaracioacuten al primer bloque encierra en el que la etiqueta se hace referencia apare

Restricciones

Algunos de los destinos posibles de un GOTO declaracioacuten no se permite En concretoun GOTO declaracioacuten no puede bifurcarse en un IF declaracioacuten CASE declaracioacuten LOOP declaracioacutensub-bloque Por ejemplo la siguiente GOTO declaracioacuten no se permite

COMENZARGOTO update_row - no se ramifican en IFSI ENTONCES vaacutelida

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1719

ltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

Como muestra el siguiente ejemplo un GOTO declaracioacuten no puede rama de un IF claacuteusula dedeclaracioacuten a otra Del mismo modo un GOTO declaracioacuten no puede rama deun CASE declaracioacuten WHEN claacuteusula a otra

COMENZARSI ENTONCES vaacutelidaGOTO update_row - no se ramifican en la claacuteusula ELSEELSEltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

El siguiente ejemplo muestra que un GOTO declaracioacuten no puede rama de un bloque que lo contienen un sub-bloque

COMENZARSi el estado = obsoletos THENGOTO delete_part - no se ramifican en sub-bloqueEND IFCOMENZAR

ltltdelete_partgtgtCANCELACIOacuteN de piezas en las ENDEND

Ademaacutes un GOTO declaracioacuten no puede ramificar hacia fuera de un subprograma como muestra esiguiente ejemplo

DECLARE

PROCEDIMIENTO compute_bonus (NUacuteMERO emp_id) ESCOMENZARGOTO update_row - no se puede ramificar hacia fuera del subprogramaENDCOMENZARltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1819

Por uacuteltimo un GOTO declaracioacuten no puede rama de un manejador de excepcioacuten en el bloqueactual Por ejemplo la siguiente GOTO declaracioacuten no se permite

DECLAREpe_ratio REALCOMENZARSelecciona el precio NVL (ingresos 0) en pe_ratio DE

ltltinsert_rowgtgtINSERT INTO VALORES Estadiacutesticas (pe_ratio )EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEpe_ratio = 0GOTO insert_row - no se puede poder en el bloque actualEND

Sin embargo un GOTO declaracioacuten puede rama de un manejador de excepciones en un bloque que contiene

Declaracioacuten de NULL

La NULL declaracioacuten no hace otra cosa que el control pase a la siguiente instruccioacuten En unconstructor condicional el NULL declaracioacuten dice a los lectores la posibilidad de que se haconsiderado pero no hay accioacuten que sea necesaria En el siguiente ejemplo el NULL declaracioacutendemuestra que no se toman medidas de excepcioacuten sin nombre

EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEROLLBACKCUANDO ENTONCES VALUE_ERROR

INSERT INTO VALORES errores COMMITCUANDO OTROS ENTONCESNULLEND

En IF las declaraciones u otros lugares que requieren por lo menos una sentencia ejecutableel NULL declaracioacuten para satisfacer a la sintaxis En el siguiente ejemplo el NULL declaracioacuten hacehincapieacute en que soacutelo los mejores empleados reciban bonificaciones

Si la calificacioacutengt 90 THEN

compute_bonus (emp_id)ELSENULLEND IF

Ademaacutes el NULL declaracioacuten es una forma praacutectica para crear recibos de la hora de disentildearaplicaciones de arriba hacia abajo Un taloacuten se subprograma ficticio que le permite diferir ladefinicioacuten de un procedimiento o funcioacuten hasta que probar y depurar el programa principal En elsiguiente ejemplo el NULL declaracioacuten cumple con el requisito de que al menos una declaracioacutendebe aparecer en la parte ejecutable de un subprograma

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1919

PROCEDIMIENTO debit_account (acct_id INTEGER REAL cantidad) ESCOMENZARNULLEND debit_account

Copyright copy 1996 2002 Oracle Corporation Todos los derechos reservados

Casa

Lista delibros

Contenido

Iacutendice

MasterIndex

Realiment

Page 4: programacion oracle

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 419

Si la primera condicioacuten es falsa o nula el ELSIF claacuteusula de las pruebas de otracondicioacuten Un IF declaracioacuten puede tener cualquier nuacutemero de ELSIF claacuteusulas lafinal ELSE claacuteusula es opcional Las condiciones son evaluadas una por una de arriba abajo Sicualquier condicioacuten es verdadera su secuencia de estados asociados se ejecuta y el control pasa asiguiente instruccioacuten Si todas las condiciones son falsas o nulo la secuencia en el ELSE se ejecutala claacuteusula Consideremos el siguiente ejemplo

COMENZARSi las ventasgt 50000 THENbono = 1500ELSIF ventasgt 35000 THENbono = 500ELSEbono = 100END IFINSERT INTO VALORES noacutemina (emp_id bonus )END

Si el valor de sales es mayor que 50000 la primera y segunda condicioacuten son verdaderas Sinembargo bonus se le asigna el valor apropiado de 1500 debido a que la segunda condicioacuten no se hprobado Cuando la primera condicioacuten es verdadera la sentencia asociada se ejecuta y el controlpasa a la INSERT comunicado

CASE

Al igual que el IF declaracioacuten el CASE declaracioacuten selecciona una secuencia de comandos que seejecutan Sin embargo para seleccionar la secuencia el CASE instruccioacuten utiliza un selector en lugde muacuteltiples expresiones booleanas (Recuerde que en el capiacutetulo 2 que el selector es una expresi

cuyo valor se utiliza para seleccionar una de varias alternativas) Para compararel IF y CASE declaraciones considere el siguiente coacutedigo que las salidas de las descripciones de logrados de la escuela

SI = grado Adbms_outputput_line (Excelente)ELSIF grado = B THENdbms_outputput_line (Muy Bueno)ELSIF grado = C THENdbms_outputput_line (bueno)ELSIF grado = D THENDBMS_OUTPUT put_line (Fair)ELSIF grado = F THENdbms_outputput_line (Pobre)ELSEdbms_outputput_line (No hay tal grado )END IF

Aviso de los cinco expresiones booleanas En cada caso comprobamos si la mismavariable grade es igual a uno de los cinco valores A B C D o F Vamos a reescribel coacutedigo anterior con el CASEdeclaracioacuten de la siguiente manera

CASO grado

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 519

CUANDO A dbms_outputput_line (Excelente)Cuando B THEN dbms_outputput_line (Muy Bueno)Cuando C THEN dbms_outputput_line (bueno)Cuando el entonces D dbms_outputput_line (Fair)CUANDO F THEN dbms_outputput_line (Pobre)ELSE dbms_outputput_line (No hay tal grado )END CASE

El CASE declaracioacuten es maacutes legible y maacutes eficiente Por lo tanto cuando sea posible vuelva aescribir largas IF-THEN-ELSIF declaraciones como CASE declaraciones

El CASE declaracioacuten comienza con la palabra clave CASE La palabra clave es seguido por unselector que es la variable grade en el uacuteltimo ejemplo La expresioacuten selector puede serarbitrariamente compleja Por ejemplo puede contener llamadas a funciones Por lo general sinembargo se trata de una sola variable La expresioacuten selector se evaluacutea soacutelo una vez Losrendimientos de los que valor puede tener cualquier tipo de datos PL SQL que no BLOB BFILE tipo de objeto un registro PL SQL un iacutendice por tabla VARRAY o una tabla anidada

El selector es seguido por uno o maacutes WHEN claacuteusulas que se comprueban de forma secuencial Elvalor de la claacuteusula de seleccioacuten determina que se ejecuta Si el valor del selector es igual al valorde un WHEN expresioacuten claacuteusula que WHEN claacuteusula se ejecuta Por ejemplo en el uacuteltimo ejemplosi grade es igual a C el programa de salidas de Good Nunca cae a traveacutes de la ejecucioacuten en caso WHEN claacuteusula se ejecuta el control pasa a la siguiente instruccioacuten

El ELSE claacuteusula funciona de manera similar a la ELSE claacuteusula de un IF comunicado En el uacuteltimoejemplo si la calificacioacuten no es una de las opciones cubiertas por una WHEN claacuteusulael ELSE claacuteusula se ha seleccionado y la frase No such grade es la salida El ELSE claacuteusula esopcional Sin embargo si se omite el ELSE claacuteusula PL SQL agrega lo siguiente

impliacutecita ELSE claacuteusulaELSE RAISE CASE_NOT_FOUND

Si el CASE declaracioacuten selecciona el impliacutecito ELSE claacuteusula PL SQL plantea la excepcioacutenpredefinida CASE_NOT_FOUND Por lo tanto siempre hay una accioacuten predeterminada incluso cuandse omite el ELSE claacuteusula

Las palabras clave END CASE terminar el CASE comunicado Estas dos palabras clave deben estarseparadas por un espacio El CASE instruccioacuten tiene la forma siguiente

[ltltlabel_namegtgt]CASO selectorCUANDO ENTONCES expression1 sequence_of_statements1CUANDO ENTONCES sequence_of_statements2 expression2CUANDO ENTONCES expressionN sequence_of_statementsN[MAacuteS sequence_of_statementsN 1]CASO EXTREMO [LABEL_NAME]

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 619

Como bloques PL SQL CASE declaraciones pueden ser etiquetados La etiqueta un identificadono declarado cerrado entre pareacutentesis angulares dobles debe aparecer al principio dela CASE comunicadoOpcionalmente el nombre de la etiqueta tambieacuten puede aparecer al final dela CASE comunicado

Las excepciones planteadas durante la ejecucioacuten de un CASE declaracioacuten se manejan de la manerahabitual Es decir las paradas normales de ejecucioacuten y control se transfiere a la parte de control d

excepciones de PL SQL bloque o subprograma

Una alternativa a la CASE declaracioacuten es el CASE expresioacuten donde cada WHEN claacuteusula es unaexpresioacuten Para maacutes detalles consulte Expresiones CASE

CASE de buacutesqueda Declaracioacuten

PL SQL tambieacuten proporciona un buscado CASE declaracioacuten que tiene la forma

[ltltlabel_namegtgt]CASO

CUANDO ENTONCES search_condition1 sequence_of_statements1CUANDO ENTONCES search_condition2 sequence_of_statements2CUANDO ENTONCES search_conditionN sequence_of_statementsN[MAacuteS sequence_of_statementsN 1]CASO EXTREMO [LABEL_NAME]

La buacutesqueda CASE declaracioacuten no tiene selector Ademaacutes su WHEN claacuteusulas contienen lascondiciones de buacutesqueda que generan un valor booleano no expresiones que pueden producir unvalor de cualquier tipo Un ejemplo es el siguiente

CASOCUANDO grado = A dbms_outputput_line (Excelente)CUANDO grado = B THEN dbms_outputput_line (Muy Bueno)CUANDO grado = C THEN dbms_outputput_line (bueno)CUANDO grado = D THEN dbms_outputput_line (Fair)CUANDO grado = F THEN dbms_outputput_line (Pobre)ELSE dbms_outputput_line (No hay tal grado )END CASE

Las condiciones de buacutesqueda son evaluados de forma secuencial El valor booleano de cadacondicioacuten de buacutesqueda determina queacute WHEN claacuteusula se ejecuta Si una condicioacuten de buacutesqueda da

como resultado TRUE suWHEN claacuteusula se ejecuta Si alguna WHEN claacuteusula se ejecuta el control paa la siguiente instruccioacuten las condiciones de buacutesqueda para posteriores no son evaluados

Si ninguna de las condiciones de buacutesqueda da como resultado TRUE el ELSE se ejecuta laclaacuteusula El ELSE claacuteusula es opcional Sin embargo si se omite el ELSE claacuteusula PL SQL agreglo siguiente impliacutecita ELSEclaacuteusula

ELSE RAISE CASE_NOT_FOUND

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 719

Las excepciones planteadas durante la ejecucioacuten de una buacutesqueda CASE declaracioacuten se manejan dela manera habitual Es decir las paradas normales de ejecucioacuten y control se transfiere a la parte dcontrol de excepciones de PL SQL bloque o subprograma

Directrices para PL SQL Sentencias condicionales

Evite torpes IF declaraciones como las del siguiente ejemplo

SI minimum_balance saldo_nuevo ltENTONCESdescubierto = TRUEELSEdescubierto = falseEND IFSI descubierto = TRUE THENRAISE insufficient_fundsEND IF

Este coacutedigo no tiene en cuenta dos hechos uacutetiles En primer lugar el valor de una expresioacuten

booleana se pueden asignar directamente a una variable Boolean Por lo tanto puede reemplazar primera IF declaracioacuten con una simple asignacioacuten de la siguiente manera

descubierto = saldo_nuevo ltminimum_balance

En segundo lugar una variable booleana en siacute es verdadera o falsa Por lo tanto puede simplificala condicioacuten en la segunda IF declaracioacuten de la siguiente manera

SI ENTONCES descubierto

Cuando sea posible utilice el ELSIF claacuteusula en lugar de anidada IF declaraciones De esta manerel coacutedigo seraacute maacutes faacutecil de leer y entender Compare las siguientes IF declaraciones

SI ENTONCES condition1 | SI ENTONCES condition1sentencia1 | sentencia1ELSE | ELSIF condition2 ENTONCESSI ENTONCES condition2 | instruccioacuten2instruccioacuten2 | ELSIF Condition3 ENTONCESELSE | Sentencia3SI ENTONCES Condition3 | END IFSentencia3 |END IF |END IF |END IF |

Estas declaraciones son loacutegicamente equivalentes pero la primera declaracioacuten oscurece el flujo dla loacutegica mientras que la segunda declaracioacuten que revela

Si usted estaacute comparando una sola expresioacuten de varios valores se puede simplificar la loacutegicamediante el uso de un uacutenico CASE declaracioacuten en lugar de un IF con varios ELSIF claacuteusulas

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 819

Iterativo de control Las sentencias de bucle y EXIT

LOOP declaraciones permiten ejecutar una secuencia de instrucciones varias veces Hay tres formade LOOP declaraciones LOOP WHILE-LOOP y FOR-LOOP

LOOP

La forma maacutes simple de LOOP declaracioacuten es la base (o infinito) de bucle que incluye una secuencde sentencias entre las palabras clave LOOP y END LOOP como sigue

LOOPsequence_of_statementsEND LOOP

Con cada repeticioacuten del bucle la secuencia de instrucciones se ejecuta el control se reanuda en laparte superior del bucle Si el procesamiento adicional es indeseable o imposible puede utilizaruna EXIT declaracioacuten para completar el ciclo Usted puede colocar una o maacutes EXIT declaraciones e

cualquier lugar dentro de un bucle pero en ninguna parte fuera de un bucle Hay dos formasde EXIT declaraciones EXIT y EXIT-WHEN

SALIDA

La EXIT declaracioacuten fuerzas para completar un ciclo sin condiciones Cuando una EXIT se encuentla instruccioacuten el bucle finaliza inmediatamente y el control pasa a la siguiente instruccioacuten Unejemplo es el siguiente

LOOP

SI credit_rating lt3 entoncesEXIT - loop salir inmediatamenteEND IFEND LOOP- El control vuelve aquiacute

El siguiente ejemplo muestra que no se puede usar la EXIT declaracioacuten para completar un bloque SQL

COMENZAR

SI credit_rating lt3 entoncesEXIT - no se permiteEND IFEND

Recuerde la EXIT declaracioacuten debe ser colocado dentro de un bucle Para completar un bloque PLSQL antes de su finalizacioacuten normal se alcanza puede utilizar el RETURN comunicado Para maacutesinformacioacuten consulteUso de la instruccioacuten RETURN

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 919

EXIT-AL

El EXIT-WHEN declaracioacuten permite que un circuito completo de forma condicional Cuando la EXIT

encuentra la instruccioacuten la condicioacuten en la WHEN claacuteusula se evaluacutea Si la condicioacuten es verdadera ciclo se completa y el control pasa a la siguiente sentencia despueacutes del bucle Un ejemplo es elsiguiente

LOOPFETCH C1 EN SALIDA AL NOTFOUND c1 - bucle de salida si la condicioacuten es verdaderaEND LOOPCLOSE c1

Hasta que la condicioacuten es verdadera el bucle no se puede completar Por lo tanto una declaracioacutendentro del bucle debe cambiar el valor de la condicioacuten En el uacuteltimo ejemplo si el FETCH sentencidevuelve una fila la condicioacuten es falsa Cuando el FETCH declaracioacuten no devuelve una fila lacondicioacuten es verdadera el ciclo se completa y el control pasa a la CLOSE comunicado

El EXIT-WHEN declaracioacuten sustituye a un simple IF comunicado Por ejemplo compare las siguiendeclaraciones

Si el recuentogt 100 THEN | SALIDA CUANDO cuentagt 100EXIT |END IF |

Estas declaraciones son loacutegicamente equivalentes pero el EXIT-WHEN declaracioacuten es maacutes faacutecil deleer y entender

Etiquetas de bucle

Como bloques PL SQL loops pueden ser etiquetados La etiqueta un identificador no declaradocerrado entre pareacutentesis angulares dobles debe aparecer al principio de la LOOP declaracioacuten de lasiguiente manera

ltltlabel_namegtgtLOOPsequence_of_statementsEND LOOP

Opcionalmente el nombre de la etiqueta tambieacuten puede aparecer al final de la LOOP declaracioacutencomo muestra el siguiente ejemplo

ltltmy_loopgtgtLOOPEND LOOP my_loop

Al nidos marcados ciclos el uso final los nombres de etiqueta para mejorar la legibilidad

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1019

Con cualquier forma de EXIT declaracioacuten usted puede completar no soacutelo el lazo de corriente peroninguacuten lazo de inclusioacuten Simplemente la etiqueta del bucle encierra que desea completar Acontinuacioacuten utilice la etiqueta de una EXIT declaracioacuten de la siguiente manera

ltltoutergtgtLOOPLOOP

SALIDA exterior cuando - Salida de los dos buclesEND LOOPEND LOOP exterior

Cada adjuntando bucle hasta e incluyendo el bucle etiquetado se sale

Bucle while

El WHILE-LOOP socios la declaracioacuten de un estado con una secuencia de sentencias encerradas por

palabras clave LOOP y END LOOP como sigue

MIENTRAS condicioacuten de buclesequence_of_statementsEND LOOP

Antes de cada iteracioacuten del bucle se evaluacutea la condicioacuten Si la condicioacuten es verdadera la secuencde instrucciones se ejecuta el control se reanuda en la parte superior del bucle Si la condicioacuten esfalsa o nula el bucle se pasa por alto y el control pasa a la siguiente instruccioacuten Un ejemplo es elsiguiente

Mientras que el total lt= 25000 LOOPSELECCIONAR sal en el sueldo de EMP DONDE total = salario total +END LOOP

El nuacutemero de iteraciones depende de la condicioacuten y se desconoce hasta que el bucle termina Lacondicioacuten se comprueba en la parte superior del bucle por lo que la secuencia podriacutea ejecutar porcero En el uacuteltimo ejemplo si el valor inicial del total es mayor que 25000 la condicioacuten es falsael bucle se pasa por alto

Algunos idiomas tienen una LOOP UNTIL o REPEAT UNTIL estructura lo que prueba la condicioacuten en parte inferior del bucle en lugar de en la parte superior Por lo tanto la secuencia de instruccionesque se ejecuta al menos una vez PL SQL no tiene una estructura tal pero se puede construir unode la siguiente manera

LOOPsequence_of_statementsSALIDA AL boolean_expressionEND LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1119

Para asegurarse de que una WHILE bucle se ejecuta al menos una vez utilizar una variable Booleaninicializa en el estado de la siguiente manera

hecho = falseMIENTRAS NO hacer LOOPsequence_of_statementshecho = boolean_expressionEND LOOP

Una declaracioacuten dentro del bucle debe asignar un nuevo valor a la variable booleana De locontrario usted tiene un bucle infinito Por ejemplo el siguiente LOOP declaraciones sonloacutegicamente equivalentes

Bucle WHILE TRUE | LOOP | END LOOP | END LOOP

FOR-LOOP

Mientras que el nuacutemero de iteraciones a traveacutes de un WHILE bucle no se conoce hasta el bucletermina el nuacutemero de iteraciones a traveacutes de una FOR bucle se conoce antes de que el bucle seintroduce FOR bucles iterar a traveacutes de un rango especiacutefico de nuacutemeros enteros La gama es parteun esquema de iteracioacuten que estaacute rodeada por las palabras clave FOR y LOOP Un doble punto ( es el operador de rango La sintaxis es la siguiente

PARA contador en [atraacutes] lower_bound higher_bound LOOPsequence_of_statementsEND LOOP

La gama se evaluacutea cuando la FOR bucle se entroacute por primera vez y nunca volver a evaluarse

Como muestra el siguiente ejemplo la secuencia de instrucciones se ejecuta una vez para cadaentero en el rango Despueacutes de cada iteracioacuten el contador del bucle se incrementa

FOR i IN 1 3 LOOP - asignar los valores 123 para isequence_of_statements - ejecuta tres vecesEND LOOP

El siguiente ejemplo muestra que si el liacutemite inferior es igual a la mayor liacutemite la secuencia de

instrucciones se ejecuta una vez

FOR i IN 3 3 LOOP - asignar el valor 3 para isequence_of_statements - se ejecuta una vezEND LOOP

Por los ingresos por defecto la iteracioacuten hacia arriba de la cota inferior a los consolidados maacutesaltos Sin embargo como muestra el siguiente ejemplo si utiliza la palabra clave REVERSE proceiteracioacuten hacia abajo desde el alto obligado a la cota inferior Despueacutes de cada iteracioacuten el contad

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1219

del bucle se decrementa Sin embargo se escriben los liacutemites variacutean en orden ascendente (nodescendente)

FOR i IN REVERSE 1 3 LOOP - asignar los valores de 321 isequence_of_statements - ejecuta tres vecesEND LOOP

Dentro de una FOR bucle el contador del bucle se puede hacer referencia como una constante perno se puede asignar valores como muestra el siguiente ejemplo

PARA CTR en 1 10 LOOPSI NO ENTONCES terminadoINSERT INTO VALUES (ctr ) - legalfactor = ctr 2 - legalELSEctr = 10 - no se permiteEND IFEND LOOP

Esquemas de iteracioacuten

Los liacutemites de un rango de bucle puede ser literales variables o expresiones sino que debe evalua los nuacutemeros De lo contrario PL SQL lanza la excepcioacuten predefinida VALUE_ERROR El liacutemiteinferior no tiene que ser 1 como los ejemplos a continuacioacuten muestran Sin embargo el incremendel contador del bucle (o disminuir) debe ser 1

j EN -5 5k AL REVEacuteS primero uacuteltimapaso en 0 TRUNCAR (alto bajo) 2

Internamente PL SQL asigna los valores de los liacutemites temporales a PLS_INTEGER variables y sinecesario redondea los valores al entero maacutes cercano El rango de magnitud de un PLS_INTEGER ede -2 31 2 31 Por lo tanto si un liacutemite como resultado un nuacutemero fuera del rango seobtiene un error de desbordamiento numeacuterico cuando PL SQL los intentos de la asignacioacuten commuestra el siguiente ejemplo

DECLARENUacuteMERO hi = 2 32COMENZARPara j EN 1 LOOP hi - provoca un error de un desbordamiento numeacuterico

END LOOPEND

Algunos lenguajes proporcionan STEP claacuteusula que le permite especificar un incremento diferent(5 en vez de 1 por ejemplo) PL SQL no tiene una estructura tal pero se puede construiruno Dentro de la FOR bucle simplemente se multiplica cada referencia al contador del bucle por enuevo incremento En el siguiente ejemplo se asigna la fecha de hoy a los elementos de 5 10 y 1de un iacutendice por tabla

DECLARE

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1319

DateList TIPO ES LA MESA DEL IacuteNDICE DE FECHA POR BINARY_INTEGERfechas DateListINTEGER constante k = 5 - conjunto nuevo incrementoCOMENZARPara j EN 1 3 LOOPfechas (j k) = SYSDATE - se multiplican bucle contador incrementoEND LOOPEND

Rangos dinaacutemicos

PL SQL le permite determinar el rango de bucle de forma dinaacutemica en tiempo de ejecucioacuten commuestra el siguiente ejemplo

SELECT COUNT (empno) EN emp_count del EMPFOR i IN 1 LOOP emp_countEND LOOP

El valor de emp_count se desconoce en tiempo de compilacioacuten el SELECT instruccioacuten devuelve elvalor en tiempo de ejecucioacuten

iquestQueacute pasa si el liacutemite inferior de un rango de bucle evaluacutea a un entero mayor que el liacutemitesuperior Como muestra el siguiente ejemplo la secuencia de declaraciones dentro del bucle no sejecuta y el control pasa a la siguiente sentencia

- Liacutemite se convierte en unDE LOOP liacutemite i IN 2 sequence_of_statements - ejecuta cero vecesEND LOOP

- El control pasa aquiacute

Las reglas de aacutembito

El contador del bucle soacutelo se define dentro del bucle No se puede hacer referencia a eacutel fuera delbucle Despueacutes se sale del bucle el contador del bucle no estaacute definido como muestra el siguientejemplo

PARA CTR en 1 10 LOOPEND LOOPsuma = ctr - 1 - no se permite

Usted no necesita declarar expliacutecitamente el contador del bucle ya que se declara impliacutecitamentecomo una variable local de tipo INTEGER El siguiente ejemplo muestra que la declaracioacuten localoculta cualquier declaracioacuten global

DECLAREctr INTEGERCOMENZARPARA CTR en 1 25 LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1419

Si Ctrgt 10 THEN - Se refiere al contador del bucleEND LOOPEND

Para hacer referencia a la variable global en este ejemplo debe utilizar una etiqueta y la notacioacutenpuntos como sigue

ltltmaingtgtDECLAREctr INTEGERCOMENZARPARA CTR en 1 25 LOOPSI mainctrgt 10 THEN - se refiere a la variable globalEND IFEND LOOPEND principal

Las reglas del aacutembito mismo se aplica a anidar FOR bucles Considere el siguiente ejemplo Ambocontadores de bucles con el mismo nombre Por lo tanto para hacer referencia al contador del buexterno del bucle interno debe utilizar una etiqueta y la notacioacuten de puntos como sigue

ltltoutergtgtPara el paso en 1 25 LOOPPara el paso en 1 10 LOOPSI outerstepgt 15 ENTONCES END LOOP

END LOOP exterior

Utilizando la sentencia EXIT

La EXIT declaracioacuten permite una FOR vuelta completa antes de tiempo Por ejemplo el siguientebucle se ejecuta normalmente diez veces pero tan pronto como el FETCH declaracioacuten no devuelveuna fila el ciclo se completa no importa cuaacutentas veces se ha ejecutado

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA AL NOTFOUND c1

END LOOP

Suponga que usted debe salir de un anidados FOR bucle antes de tiempo Puede completar no soacutelolazo de corriente pero ninguacuten lazo de inclusioacuten Simplemente la etiqueta del bucle encierra quedesea completar A continuacioacuten utilice la etiqueta de una EXIT declaracioacuten para especificarqueacute FOR bucle de salida de la siguiente manera

ltltoutergtgtFOR i IN 1 5 LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1519

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA exterior cuando NOTFOUND c1 - salida tanto para los buclesEND LOOPEND LOOP exterior- El control pasa aquiacute

Secuencial de control GOTO y declaraciones NULL

A diferencia de la IF y LOOP declaraciones el GOTO y NULL declaraciones no son cruciales para PL SQL de programacioacuten La estructura de PL SQL es tal que el GOTO declaracioacuten es rara veznecesario De vez en cuando se puede simplificar la loacutegica suficiente como para justificar suuso La NULL declaracioacuten puede mejorar la legibilidad al hacer que el significado y la accioacuten de lasentencias condicionales claro

El uso excesivo de GOTO declaraciones puede generar un coacutedigo complejo no estructurada (a vecellamado spaghetti coacutedigo) que es difiacutecil de entender y mantener Por lo tanto el

uso GOTO declaraciones con moderacioacuten Por ejemplo para poder partir de una estructura anidadauna rutina de control de errores una excepcioacuten en lugar de utilizar un GOTO comunicado

GoTo

El GOTO ramas declaracioacuten a una etiqueta de manera incondicional La etiqueta debe ser uacutenico en alcance y debe preceder a una sentencia ejecutable o un bloque PL SQL Cuando se ejecutael GOTO transfiere el informe de control a la sentencia etiquetada o del bloque En el siguienteejemplo usted va a una sentencia ejecutable maacutes abajo en una secuencia de instrucciones

COMENZARGOTO insert_rowltltinsert_rowgtgtINSERT INTO VALORES emp END

En el siguiente ejemplo usted va a un bloque PL SQL maacutes arriba en una secuencia deinstrucciones

COMENZARltltupdate_rowgtgtCOMENZARACTUALIZACIOacuteN eacutenfasis JUEGO ENDGOTO update_rowEND

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1619

La etiqueta end_loop en el siguiente ejemplo no estaacute permitido porque no precede a una sentenciaejecutable

DECLAREhace booleanCOMENZARFOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgt - No se permiteEND LOOP - no es una sentencia ejecutableEND

Para depurar el uacuteltimo ejemplo soacutelo tiene que antildeadir el NULL declaracioacuten de la siguiente manera

FOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgtNULL - una sentencia ejecutableEND LOOP

Como muestra el siguiente ejemplo un GOTO declaracioacuten puede rama de un bloque que lo contiendesde el bloque actual

DECLAREmy_ename CHAR (10)COMENZARltltget_namegtgtSELECCIONAR Ename EN my_ename de EMP DONDE COMENZARObtiene_nombre GOTO - rama adjuntando bloqueENDEND

El GOTO ramas declaracioacuten al primer bloque encierra en el que la etiqueta se hace referencia apare

Restricciones

Algunos de los destinos posibles de un GOTO declaracioacuten no se permite En concretoun GOTO declaracioacuten no puede bifurcarse en un IF declaracioacuten CASE declaracioacuten LOOP declaracioacutensub-bloque Por ejemplo la siguiente GOTO declaracioacuten no se permite

COMENZARGOTO update_row - no se ramifican en IFSI ENTONCES vaacutelida

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1719

ltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

Como muestra el siguiente ejemplo un GOTO declaracioacuten no puede rama de un IF claacuteusula dedeclaracioacuten a otra Del mismo modo un GOTO declaracioacuten no puede rama deun CASE declaracioacuten WHEN claacuteusula a otra

COMENZARSI ENTONCES vaacutelidaGOTO update_row - no se ramifican en la claacuteusula ELSEELSEltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

El siguiente ejemplo muestra que un GOTO declaracioacuten no puede rama de un bloque que lo contienen un sub-bloque

COMENZARSi el estado = obsoletos THENGOTO delete_part - no se ramifican en sub-bloqueEND IFCOMENZAR

ltltdelete_partgtgtCANCELACIOacuteN de piezas en las ENDEND

Ademaacutes un GOTO declaracioacuten no puede ramificar hacia fuera de un subprograma como muestra esiguiente ejemplo

DECLARE

PROCEDIMIENTO compute_bonus (NUacuteMERO emp_id) ESCOMENZARGOTO update_row - no se puede ramificar hacia fuera del subprogramaENDCOMENZARltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1819

Por uacuteltimo un GOTO declaracioacuten no puede rama de un manejador de excepcioacuten en el bloqueactual Por ejemplo la siguiente GOTO declaracioacuten no se permite

DECLAREpe_ratio REALCOMENZARSelecciona el precio NVL (ingresos 0) en pe_ratio DE

ltltinsert_rowgtgtINSERT INTO VALORES Estadiacutesticas (pe_ratio )EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEpe_ratio = 0GOTO insert_row - no se puede poder en el bloque actualEND

Sin embargo un GOTO declaracioacuten puede rama de un manejador de excepciones en un bloque que contiene

Declaracioacuten de NULL

La NULL declaracioacuten no hace otra cosa que el control pase a la siguiente instruccioacuten En unconstructor condicional el NULL declaracioacuten dice a los lectores la posibilidad de que se haconsiderado pero no hay accioacuten que sea necesaria En el siguiente ejemplo el NULL declaracioacutendemuestra que no se toman medidas de excepcioacuten sin nombre

EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEROLLBACKCUANDO ENTONCES VALUE_ERROR

INSERT INTO VALORES errores COMMITCUANDO OTROS ENTONCESNULLEND

En IF las declaraciones u otros lugares que requieren por lo menos una sentencia ejecutableel NULL declaracioacuten para satisfacer a la sintaxis En el siguiente ejemplo el NULL declaracioacuten hacehincapieacute en que soacutelo los mejores empleados reciban bonificaciones

Si la calificacioacutengt 90 THEN

compute_bonus (emp_id)ELSENULLEND IF

Ademaacutes el NULL declaracioacuten es una forma praacutectica para crear recibos de la hora de disentildearaplicaciones de arriba hacia abajo Un taloacuten se subprograma ficticio que le permite diferir ladefinicioacuten de un procedimiento o funcioacuten hasta que probar y depurar el programa principal En elsiguiente ejemplo el NULL declaracioacuten cumple con el requisito de que al menos una declaracioacutendebe aparecer en la parte ejecutable de un subprograma

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1919

PROCEDIMIENTO debit_account (acct_id INTEGER REAL cantidad) ESCOMENZARNULLEND debit_account

Copyright copy 1996 2002 Oracle Corporation Todos los derechos reservados

Casa

Lista delibros

Contenido

Iacutendice

MasterIndex

Realiment

Page 5: programacion oracle

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 519

CUANDO A dbms_outputput_line (Excelente)Cuando B THEN dbms_outputput_line (Muy Bueno)Cuando C THEN dbms_outputput_line (bueno)Cuando el entonces D dbms_outputput_line (Fair)CUANDO F THEN dbms_outputput_line (Pobre)ELSE dbms_outputput_line (No hay tal grado )END CASE

El CASE declaracioacuten es maacutes legible y maacutes eficiente Por lo tanto cuando sea posible vuelva aescribir largas IF-THEN-ELSIF declaraciones como CASE declaraciones

El CASE declaracioacuten comienza con la palabra clave CASE La palabra clave es seguido por unselector que es la variable grade en el uacuteltimo ejemplo La expresioacuten selector puede serarbitrariamente compleja Por ejemplo puede contener llamadas a funciones Por lo general sinembargo se trata de una sola variable La expresioacuten selector se evaluacutea soacutelo una vez Losrendimientos de los que valor puede tener cualquier tipo de datos PL SQL que no BLOB BFILE tipo de objeto un registro PL SQL un iacutendice por tabla VARRAY o una tabla anidada

El selector es seguido por uno o maacutes WHEN claacuteusulas que se comprueban de forma secuencial Elvalor de la claacuteusula de seleccioacuten determina que se ejecuta Si el valor del selector es igual al valorde un WHEN expresioacuten claacuteusula que WHEN claacuteusula se ejecuta Por ejemplo en el uacuteltimo ejemplosi grade es igual a C el programa de salidas de Good Nunca cae a traveacutes de la ejecucioacuten en caso WHEN claacuteusula se ejecuta el control pasa a la siguiente instruccioacuten

El ELSE claacuteusula funciona de manera similar a la ELSE claacuteusula de un IF comunicado En el uacuteltimoejemplo si la calificacioacuten no es una de las opciones cubiertas por una WHEN claacuteusulael ELSE claacuteusula se ha seleccionado y la frase No such grade es la salida El ELSE claacuteusula esopcional Sin embargo si se omite el ELSE claacuteusula PL SQL agrega lo siguiente

impliacutecita ELSE claacuteusulaELSE RAISE CASE_NOT_FOUND

Si el CASE declaracioacuten selecciona el impliacutecito ELSE claacuteusula PL SQL plantea la excepcioacutenpredefinida CASE_NOT_FOUND Por lo tanto siempre hay una accioacuten predeterminada incluso cuandse omite el ELSE claacuteusula

Las palabras clave END CASE terminar el CASE comunicado Estas dos palabras clave deben estarseparadas por un espacio El CASE instruccioacuten tiene la forma siguiente

[ltltlabel_namegtgt]CASO selectorCUANDO ENTONCES expression1 sequence_of_statements1CUANDO ENTONCES sequence_of_statements2 expression2CUANDO ENTONCES expressionN sequence_of_statementsN[MAacuteS sequence_of_statementsN 1]CASO EXTREMO [LABEL_NAME]

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 619

Como bloques PL SQL CASE declaraciones pueden ser etiquetados La etiqueta un identificadono declarado cerrado entre pareacutentesis angulares dobles debe aparecer al principio dela CASE comunicadoOpcionalmente el nombre de la etiqueta tambieacuten puede aparecer al final dela CASE comunicado

Las excepciones planteadas durante la ejecucioacuten de un CASE declaracioacuten se manejan de la manerahabitual Es decir las paradas normales de ejecucioacuten y control se transfiere a la parte de control d

excepciones de PL SQL bloque o subprograma

Una alternativa a la CASE declaracioacuten es el CASE expresioacuten donde cada WHEN claacuteusula es unaexpresioacuten Para maacutes detalles consulte Expresiones CASE

CASE de buacutesqueda Declaracioacuten

PL SQL tambieacuten proporciona un buscado CASE declaracioacuten que tiene la forma

[ltltlabel_namegtgt]CASO

CUANDO ENTONCES search_condition1 sequence_of_statements1CUANDO ENTONCES search_condition2 sequence_of_statements2CUANDO ENTONCES search_conditionN sequence_of_statementsN[MAacuteS sequence_of_statementsN 1]CASO EXTREMO [LABEL_NAME]

La buacutesqueda CASE declaracioacuten no tiene selector Ademaacutes su WHEN claacuteusulas contienen lascondiciones de buacutesqueda que generan un valor booleano no expresiones que pueden producir unvalor de cualquier tipo Un ejemplo es el siguiente

CASOCUANDO grado = A dbms_outputput_line (Excelente)CUANDO grado = B THEN dbms_outputput_line (Muy Bueno)CUANDO grado = C THEN dbms_outputput_line (bueno)CUANDO grado = D THEN dbms_outputput_line (Fair)CUANDO grado = F THEN dbms_outputput_line (Pobre)ELSE dbms_outputput_line (No hay tal grado )END CASE

Las condiciones de buacutesqueda son evaluados de forma secuencial El valor booleano de cadacondicioacuten de buacutesqueda determina queacute WHEN claacuteusula se ejecuta Si una condicioacuten de buacutesqueda da

como resultado TRUE suWHEN claacuteusula se ejecuta Si alguna WHEN claacuteusula se ejecuta el control paa la siguiente instruccioacuten las condiciones de buacutesqueda para posteriores no son evaluados

Si ninguna de las condiciones de buacutesqueda da como resultado TRUE el ELSE se ejecuta laclaacuteusula El ELSE claacuteusula es opcional Sin embargo si se omite el ELSE claacuteusula PL SQL agreglo siguiente impliacutecita ELSEclaacuteusula

ELSE RAISE CASE_NOT_FOUND

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 719

Las excepciones planteadas durante la ejecucioacuten de una buacutesqueda CASE declaracioacuten se manejan dela manera habitual Es decir las paradas normales de ejecucioacuten y control se transfiere a la parte dcontrol de excepciones de PL SQL bloque o subprograma

Directrices para PL SQL Sentencias condicionales

Evite torpes IF declaraciones como las del siguiente ejemplo

SI minimum_balance saldo_nuevo ltENTONCESdescubierto = TRUEELSEdescubierto = falseEND IFSI descubierto = TRUE THENRAISE insufficient_fundsEND IF

Este coacutedigo no tiene en cuenta dos hechos uacutetiles En primer lugar el valor de una expresioacuten

booleana se pueden asignar directamente a una variable Boolean Por lo tanto puede reemplazar primera IF declaracioacuten con una simple asignacioacuten de la siguiente manera

descubierto = saldo_nuevo ltminimum_balance

En segundo lugar una variable booleana en siacute es verdadera o falsa Por lo tanto puede simplificala condicioacuten en la segunda IF declaracioacuten de la siguiente manera

SI ENTONCES descubierto

Cuando sea posible utilice el ELSIF claacuteusula en lugar de anidada IF declaraciones De esta manerel coacutedigo seraacute maacutes faacutecil de leer y entender Compare las siguientes IF declaraciones

SI ENTONCES condition1 | SI ENTONCES condition1sentencia1 | sentencia1ELSE | ELSIF condition2 ENTONCESSI ENTONCES condition2 | instruccioacuten2instruccioacuten2 | ELSIF Condition3 ENTONCESELSE | Sentencia3SI ENTONCES Condition3 | END IFSentencia3 |END IF |END IF |END IF |

Estas declaraciones son loacutegicamente equivalentes pero la primera declaracioacuten oscurece el flujo dla loacutegica mientras que la segunda declaracioacuten que revela

Si usted estaacute comparando una sola expresioacuten de varios valores se puede simplificar la loacutegicamediante el uso de un uacutenico CASE declaracioacuten en lugar de un IF con varios ELSIF claacuteusulas

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 819

Iterativo de control Las sentencias de bucle y EXIT

LOOP declaraciones permiten ejecutar una secuencia de instrucciones varias veces Hay tres formade LOOP declaraciones LOOP WHILE-LOOP y FOR-LOOP

LOOP

La forma maacutes simple de LOOP declaracioacuten es la base (o infinito) de bucle que incluye una secuencde sentencias entre las palabras clave LOOP y END LOOP como sigue

LOOPsequence_of_statementsEND LOOP

Con cada repeticioacuten del bucle la secuencia de instrucciones se ejecuta el control se reanuda en laparte superior del bucle Si el procesamiento adicional es indeseable o imposible puede utilizaruna EXIT declaracioacuten para completar el ciclo Usted puede colocar una o maacutes EXIT declaraciones e

cualquier lugar dentro de un bucle pero en ninguna parte fuera de un bucle Hay dos formasde EXIT declaraciones EXIT y EXIT-WHEN

SALIDA

La EXIT declaracioacuten fuerzas para completar un ciclo sin condiciones Cuando una EXIT se encuentla instruccioacuten el bucle finaliza inmediatamente y el control pasa a la siguiente instruccioacuten Unejemplo es el siguiente

LOOP

SI credit_rating lt3 entoncesEXIT - loop salir inmediatamenteEND IFEND LOOP- El control vuelve aquiacute

El siguiente ejemplo muestra que no se puede usar la EXIT declaracioacuten para completar un bloque SQL

COMENZAR

SI credit_rating lt3 entoncesEXIT - no se permiteEND IFEND

Recuerde la EXIT declaracioacuten debe ser colocado dentro de un bucle Para completar un bloque PLSQL antes de su finalizacioacuten normal se alcanza puede utilizar el RETURN comunicado Para maacutesinformacioacuten consulteUso de la instruccioacuten RETURN

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 919

EXIT-AL

El EXIT-WHEN declaracioacuten permite que un circuito completo de forma condicional Cuando la EXIT

encuentra la instruccioacuten la condicioacuten en la WHEN claacuteusula se evaluacutea Si la condicioacuten es verdadera ciclo se completa y el control pasa a la siguiente sentencia despueacutes del bucle Un ejemplo es elsiguiente

LOOPFETCH C1 EN SALIDA AL NOTFOUND c1 - bucle de salida si la condicioacuten es verdaderaEND LOOPCLOSE c1

Hasta que la condicioacuten es verdadera el bucle no se puede completar Por lo tanto una declaracioacutendentro del bucle debe cambiar el valor de la condicioacuten En el uacuteltimo ejemplo si el FETCH sentencidevuelve una fila la condicioacuten es falsa Cuando el FETCH declaracioacuten no devuelve una fila lacondicioacuten es verdadera el ciclo se completa y el control pasa a la CLOSE comunicado

El EXIT-WHEN declaracioacuten sustituye a un simple IF comunicado Por ejemplo compare las siguiendeclaraciones

Si el recuentogt 100 THEN | SALIDA CUANDO cuentagt 100EXIT |END IF |

Estas declaraciones son loacutegicamente equivalentes pero el EXIT-WHEN declaracioacuten es maacutes faacutecil deleer y entender

Etiquetas de bucle

Como bloques PL SQL loops pueden ser etiquetados La etiqueta un identificador no declaradocerrado entre pareacutentesis angulares dobles debe aparecer al principio de la LOOP declaracioacuten de lasiguiente manera

ltltlabel_namegtgtLOOPsequence_of_statementsEND LOOP

Opcionalmente el nombre de la etiqueta tambieacuten puede aparecer al final de la LOOP declaracioacutencomo muestra el siguiente ejemplo

ltltmy_loopgtgtLOOPEND LOOP my_loop

Al nidos marcados ciclos el uso final los nombres de etiqueta para mejorar la legibilidad

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1019

Con cualquier forma de EXIT declaracioacuten usted puede completar no soacutelo el lazo de corriente peroninguacuten lazo de inclusioacuten Simplemente la etiqueta del bucle encierra que desea completar Acontinuacioacuten utilice la etiqueta de una EXIT declaracioacuten de la siguiente manera

ltltoutergtgtLOOPLOOP

SALIDA exterior cuando - Salida de los dos buclesEND LOOPEND LOOP exterior

Cada adjuntando bucle hasta e incluyendo el bucle etiquetado se sale

Bucle while

El WHILE-LOOP socios la declaracioacuten de un estado con una secuencia de sentencias encerradas por

palabras clave LOOP y END LOOP como sigue

MIENTRAS condicioacuten de buclesequence_of_statementsEND LOOP

Antes de cada iteracioacuten del bucle se evaluacutea la condicioacuten Si la condicioacuten es verdadera la secuencde instrucciones se ejecuta el control se reanuda en la parte superior del bucle Si la condicioacuten esfalsa o nula el bucle se pasa por alto y el control pasa a la siguiente instruccioacuten Un ejemplo es elsiguiente

Mientras que el total lt= 25000 LOOPSELECCIONAR sal en el sueldo de EMP DONDE total = salario total +END LOOP

El nuacutemero de iteraciones depende de la condicioacuten y se desconoce hasta que el bucle termina Lacondicioacuten se comprueba en la parte superior del bucle por lo que la secuencia podriacutea ejecutar porcero En el uacuteltimo ejemplo si el valor inicial del total es mayor que 25000 la condicioacuten es falsael bucle se pasa por alto

Algunos idiomas tienen una LOOP UNTIL o REPEAT UNTIL estructura lo que prueba la condicioacuten en parte inferior del bucle en lugar de en la parte superior Por lo tanto la secuencia de instruccionesque se ejecuta al menos una vez PL SQL no tiene una estructura tal pero se puede construir unode la siguiente manera

LOOPsequence_of_statementsSALIDA AL boolean_expressionEND LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1119

Para asegurarse de que una WHILE bucle se ejecuta al menos una vez utilizar una variable Booleaninicializa en el estado de la siguiente manera

hecho = falseMIENTRAS NO hacer LOOPsequence_of_statementshecho = boolean_expressionEND LOOP

Una declaracioacuten dentro del bucle debe asignar un nuevo valor a la variable booleana De locontrario usted tiene un bucle infinito Por ejemplo el siguiente LOOP declaraciones sonloacutegicamente equivalentes

Bucle WHILE TRUE | LOOP | END LOOP | END LOOP

FOR-LOOP

Mientras que el nuacutemero de iteraciones a traveacutes de un WHILE bucle no se conoce hasta el bucletermina el nuacutemero de iteraciones a traveacutes de una FOR bucle se conoce antes de que el bucle seintroduce FOR bucles iterar a traveacutes de un rango especiacutefico de nuacutemeros enteros La gama es parteun esquema de iteracioacuten que estaacute rodeada por las palabras clave FOR y LOOP Un doble punto ( es el operador de rango La sintaxis es la siguiente

PARA contador en [atraacutes] lower_bound higher_bound LOOPsequence_of_statementsEND LOOP

La gama se evaluacutea cuando la FOR bucle se entroacute por primera vez y nunca volver a evaluarse

Como muestra el siguiente ejemplo la secuencia de instrucciones se ejecuta una vez para cadaentero en el rango Despueacutes de cada iteracioacuten el contador del bucle se incrementa

FOR i IN 1 3 LOOP - asignar los valores 123 para isequence_of_statements - ejecuta tres vecesEND LOOP

El siguiente ejemplo muestra que si el liacutemite inferior es igual a la mayor liacutemite la secuencia de

instrucciones se ejecuta una vez

FOR i IN 3 3 LOOP - asignar el valor 3 para isequence_of_statements - se ejecuta una vezEND LOOP

Por los ingresos por defecto la iteracioacuten hacia arriba de la cota inferior a los consolidados maacutesaltos Sin embargo como muestra el siguiente ejemplo si utiliza la palabra clave REVERSE proceiteracioacuten hacia abajo desde el alto obligado a la cota inferior Despueacutes de cada iteracioacuten el contad

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1219

del bucle se decrementa Sin embargo se escriben los liacutemites variacutean en orden ascendente (nodescendente)

FOR i IN REVERSE 1 3 LOOP - asignar los valores de 321 isequence_of_statements - ejecuta tres vecesEND LOOP

Dentro de una FOR bucle el contador del bucle se puede hacer referencia como una constante perno se puede asignar valores como muestra el siguiente ejemplo

PARA CTR en 1 10 LOOPSI NO ENTONCES terminadoINSERT INTO VALUES (ctr ) - legalfactor = ctr 2 - legalELSEctr = 10 - no se permiteEND IFEND LOOP

Esquemas de iteracioacuten

Los liacutemites de un rango de bucle puede ser literales variables o expresiones sino que debe evalua los nuacutemeros De lo contrario PL SQL lanza la excepcioacuten predefinida VALUE_ERROR El liacutemiteinferior no tiene que ser 1 como los ejemplos a continuacioacuten muestran Sin embargo el incremendel contador del bucle (o disminuir) debe ser 1

j EN -5 5k AL REVEacuteS primero uacuteltimapaso en 0 TRUNCAR (alto bajo) 2

Internamente PL SQL asigna los valores de los liacutemites temporales a PLS_INTEGER variables y sinecesario redondea los valores al entero maacutes cercano El rango de magnitud de un PLS_INTEGER ede -2 31 2 31 Por lo tanto si un liacutemite como resultado un nuacutemero fuera del rango seobtiene un error de desbordamiento numeacuterico cuando PL SQL los intentos de la asignacioacuten commuestra el siguiente ejemplo

DECLARENUacuteMERO hi = 2 32COMENZARPara j EN 1 LOOP hi - provoca un error de un desbordamiento numeacuterico

END LOOPEND

Algunos lenguajes proporcionan STEP claacuteusula que le permite especificar un incremento diferent(5 en vez de 1 por ejemplo) PL SQL no tiene una estructura tal pero se puede construiruno Dentro de la FOR bucle simplemente se multiplica cada referencia al contador del bucle por enuevo incremento En el siguiente ejemplo se asigna la fecha de hoy a los elementos de 5 10 y 1de un iacutendice por tabla

DECLARE

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1319

DateList TIPO ES LA MESA DEL IacuteNDICE DE FECHA POR BINARY_INTEGERfechas DateListINTEGER constante k = 5 - conjunto nuevo incrementoCOMENZARPara j EN 1 3 LOOPfechas (j k) = SYSDATE - se multiplican bucle contador incrementoEND LOOPEND

Rangos dinaacutemicos

PL SQL le permite determinar el rango de bucle de forma dinaacutemica en tiempo de ejecucioacuten commuestra el siguiente ejemplo

SELECT COUNT (empno) EN emp_count del EMPFOR i IN 1 LOOP emp_countEND LOOP

El valor de emp_count se desconoce en tiempo de compilacioacuten el SELECT instruccioacuten devuelve elvalor en tiempo de ejecucioacuten

iquestQueacute pasa si el liacutemite inferior de un rango de bucle evaluacutea a un entero mayor que el liacutemitesuperior Como muestra el siguiente ejemplo la secuencia de declaraciones dentro del bucle no sejecuta y el control pasa a la siguiente sentencia

- Liacutemite se convierte en unDE LOOP liacutemite i IN 2 sequence_of_statements - ejecuta cero vecesEND LOOP

- El control pasa aquiacute

Las reglas de aacutembito

El contador del bucle soacutelo se define dentro del bucle No se puede hacer referencia a eacutel fuera delbucle Despueacutes se sale del bucle el contador del bucle no estaacute definido como muestra el siguientejemplo

PARA CTR en 1 10 LOOPEND LOOPsuma = ctr - 1 - no se permite

Usted no necesita declarar expliacutecitamente el contador del bucle ya que se declara impliacutecitamentecomo una variable local de tipo INTEGER El siguiente ejemplo muestra que la declaracioacuten localoculta cualquier declaracioacuten global

DECLAREctr INTEGERCOMENZARPARA CTR en 1 25 LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1419

Si Ctrgt 10 THEN - Se refiere al contador del bucleEND LOOPEND

Para hacer referencia a la variable global en este ejemplo debe utilizar una etiqueta y la notacioacutenpuntos como sigue

ltltmaingtgtDECLAREctr INTEGERCOMENZARPARA CTR en 1 25 LOOPSI mainctrgt 10 THEN - se refiere a la variable globalEND IFEND LOOPEND principal

Las reglas del aacutembito mismo se aplica a anidar FOR bucles Considere el siguiente ejemplo Ambocontadores de bucles con el mismo nombre Por lo tanto para hacer referencia al contador del buexterno del bucle interno debe utilizar una etiqueta y la notacioacuten de puntos como sigue

ltltoutergtgtPara el paso en 1 25 LOOPPara el paso en 1 10 LOOPSI outerstepgt 15 ENTONCES END LOOP

END LOOP exterior

Utilizando la sentencia EXIT

La EXIT declaracioacuten permite una FOR vuelta completa antes de tiempo Por ejemplo el siguientebucle se ejecuta normalmente diez veces pero tan pronto como el FETCH declaracioacuten no devuelveuna fila el ciclo se completa no importa cuaacutentas veces se ha ejecutado

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA AL NOTFOUND c1

END LOOP

Suponga que usted debe salir de un anidados FOR bucle antes de tiempo Puede completar no soacutelolazo de corriente pero ninguacuten lazo de inclusioacuten Simplemente la etiqueta del bucle encierra quedesea completar A continuacioacuten utilice la etiqueta de una EXIT declaracioacuten para especificarqueacute FOR bucle de salida de la siguiente manera

ltltoutergtgtFOR i IN 1 5 LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1519

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA exterior cuando NOTFOUND c1 - salida tanto para los buclesEND LOOPEND LOOP exterior- El control pasa aquiacute

Secuencial de control GOTO y declaraciones NULL

A diferencia de la IF y LOOP declaraciones el GOTO y NULL declaraciones no son cruciales para PL SQL de programacioacuten La estructura de PL SQL es tal que el GOTO declaracioacuten es rara veznecesario De vez en cuando se puede simplificar la loacutegica suficiente como para justificar suuso La NULL declaracioacuten puede mejorar la legibilidad al hacer que el significado y la accioacuten de lasentencias condicionales claro

El uso excesivo de GOTO declaraciones puede generar un coacutedigo complejo no estructurada (a vecellamado spaghetti coacutedigo) que es difiacutecil de entender y mantener Por lo tanto el

uso GOTO declaraciones con moderacioacuten Por ejemplo para poder partir de una estructura anidadauna rutina de control de errores una excepcioacuten en lugar de utilizar un GOTO comunicado

GoTo

El GOTO ramas declaracioacuten a una etiqueta de manera incondicional La etiqueta debe ser uacutenico en alcance y debe preceder a una sentencia ejecutable o un bloque PL SQL Cuando se ejecutael GOTO transfiere el informe de control a la sentencia etiquetada o del bloque En el siguienteejemplo usted va a una sentencia ejecutable maacutes abajo en una secuencia de instrucciones

COMENZARGOTO insert_rowltltinsert_rowgtgtINSERT INTO VALORES emp END

En el siguiente ejemplo usted va a un bloque PL SQL maacutes arriba en una secuencia deinstrucciones

COMENZARltltupdate_rowgtgtCOMENZARACTUALIZACIOacuteN eacutenfasis JUEGO ENDGOTO update_rowEND

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1619

La etiqueta end_loop en el siguiente ejemplo no estaacute permitido porque no precede a una sentenciaejecutable

DECLAREhace booleanCOMENZARFOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgt - No se permiteEND LOOP - no es una sentencia ejecutableEND

Para depurar el uacuteltimo ejemplo soacutelo tiene que antildeadir el NULL declaracioacuten de la siguiente manera

FOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgtNULL - una sentencia ejecutableEND LOOP

Como muestra el siguiente ejemplo un GOTO declaracioacuten puede rama de un bloque que lo contiendesde el bloque actual

DECLAREmy_ename CHAR (10)COMENZARltltget_namegtgtSELECCIONAR Ename EN my_ename de EMP DONDE COMENZARObtiene_nombre GOTO - rama adjuntando bloqueENDEND

El GOTO ramas declaracioacuten al primer bloque encierra en el que la etiqueta se hace referencia apare

Restricciones

Algunos de los destinos posibles de un GOTO declaracioacuten no se permite En concretoun GOTO declaracioacuten no puede bifurcarse en un IF declaracioacuten CASE declaracioacuten LOOP declaracioacutensub-bloque Por ejemplo la siguiente GOTO declaracioacuten no se permite

COMENZARGOTO update_row - no se ramifican en IFSI ENTONCES vaacutelida

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1719

ltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

Como muestra el siguiente ejemplo un GOTO declaracioacuten no puede rama de un IF claacuteusula dedeclaracioacuten a otra Del mismo modo un GOTO declaracioacuten no puede rama deun CASE declaracioacuten WHEN claacuteusula a otra

COMENZARSI ENTONCES vaacutelidaGOTO update_row - no se ramifican en la claacuteusula ELSEELSEltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

El siguiente ejemplo muestra que un GOTO declaracioacuten no puede rama de un bloque que lo contienen un sub-bloque

COMENZARSi el estado = obsoletos THENGOTO delete_part - no se ramifican en sub-bloqueEND IFCOMENZAR

ltltdelete_partgtgtCANCELACIOacuteN de piezas en las ENDEND

Ademaacutes un GOTO declaracioacuten no puede ramificar hacia fuera de un subprograma como muestra esiguiente ejemplo

DECLARE

PROCEDIMIENTO compute_bonus (NUacuteMERO emp_id) ESCOMENZARGOTO update_row - no se puede ramificar hacia fuera del subprogramaENDCOMENZARltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1819

Por uacuteltimo un GOTO declaracioacuten no puede rama de un manejador de excepcioacuten en el bloqueactual Por ejemplo la siguiente GOTO declaracioacuten no se permite

DECLAREpe_ratio REALCOMENZARSelecciona el precio NVL (ingresos 0) en pe_ratio DE

ltltinsert_rowgtgtINSERT INTO VALORES Estadiacutesticas (pe_ratio )EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEpe_ratio = 0GOTO insert_row - no se puede poder en el bloque actualEND

Sin embargo un GOTO declaracioacuten puede rama de un manejador de excepciones en un bloque que contiene

Declaracioacuten de NULL

La NULL declaracioacuten no hace otra cosa que el control pase a la siguiente instruccioacuten En unconstructor condicional el NULL declaracioacuten dice a los lectores la posibilidad de que se haconsiderado pero no hay accioacuten que sea necesaria En el siguiente ejemplo el NULL declaracioacutendemuestra que no se toman medidas de excepcioacuten sin nombre

EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEROLLBACKCUANDO ENTONCES VALUE_ERROR

INSERT INTO VALORES errores COMMITCUANDO OTROS ENTONCESNULLEND

En IF las declaraciones u otros lugares que requieren por lo menos una sentencia ejecutableel NULL declaracioacuten para satisfacer a la sintaxis En el siguiente ejemplo el NULL declaracioacuten hacehincapieacute en que soacutelo los mejores empleados reciban bonificaciones

Si la calificacioacutengt 90 THEN

compute_bonus (emp_id)ELSENULLEND IF

Ademaacutes el NULL declaracioacuten es una forma praacutectica para crear recibos de la hora de disentildearaplicaciones de arriba hacia abajo Un taloacuten se subprograma ficticio que le permite diferir ladefinicioacuten de un procedimiento o funcioacuten hasta que probar y depurar el programa principal En elsiguiente ejemplo el NULL declaracioacuten cumple con el requisito de que al menos una declaracioacutendebe aparecer en la parte ejecutable de un subprograma

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1919

PROCEDIMIENTO debit_account (acct_id INTEGER REAL cantidad) ESCOMENZARNULLEND debit_account

Copyright copy 1996 2002 Oracle Corporation Todos los derechos reservados

Casa

Lista delibros

Contenido

Iacutendice

MasterIndex

Realiment

Page 6: programacion oracle

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 619

Como bloques PL SQL CASE declaraciones pueden ser etiquetados La etiqueta un identificadono declarado cerrado entre pareacutentesis angulares dobles debe aparecer al principio dela CASE comunicadoOpcionalmente el nombre de la etiqueta tambieacuten puede aparecer al final dela CASE comunicado

Las excepciones planteadas durante la ejecucioacuten de un CASE declaracioacuten se manejan de la manerahabitual Es decir las paradas normales de ejecucioacuten y control se transfiere a la parte de control d

excepciones de PL SQL bloque o subprograma

Una alternativa a la CASE declaracioacuten es el CASE expresioacuten donde cada WHEN claacuteusula es unaexpresioacuten Para maacutes detalles consulte Expresiones CASE

CASE de buacutesqueda Declaracioacuten

PL SQL tambieacuten proporciona un buscado CASE declaracioacuten que tiene la forma

[ltltlabel_namegtgt]CASO

CUANDO ENTONCES search_condition1 sequence_of_statements1CUANDO ENTONCES search_condition2 sequence_of_statements2CUANDO ENTONCES search_conditionN sequence_of_statementsN[MAacuteS sequence_of_statementsN 1]CASO EXTREMO [LABEL_NAME]

La buacutesqueda CASE declaracioacuten no tiene selector Ademaacutes su WHEN claacuteusulas contienen lascondiciones de buacutesqueda que generan un valor booleano no expresiones que pueden producir unvalor de cualquier tipo Un ejemplo es el siguiente

CASOCUANDO grado = A dbms_outputput_line (Excelente)CUANDO grado = B THEN dbms_outputput_line (Muy Bueno)CUANDO grado = C THEN dbms_outputput_line (bueno)CUANDO grado = D THEN dbms_outputput_line (Fair)CUANDO grado = F THEN dbms_outputput_line (Pobre)ELSE dbms_outputput_line (No hay tal grado )END CASE

Las condiciones de buacutesqueda son evaluados de forma secuencial El valor booleano de cadacondicioacuten de buacutesqueda determina queacute WHEN claacuteusula se ejecuta Si una condicioacuten de buacutesqueda da

como resultado TRUE suWHEN claacuteusula se ejecuta Si alguna WHEN claacuteusula se ejecuta el control paa la siguiente instruccioacuten las condiciones de buacutesqueda para posteriores no son evaluados

Si ninguna de las condiciones de buacutesqueda da como resultado TRUE el ELSE se ejecuta laclaacuteusula El ELSE claacuteusula es opcional Sin embargo si se omite el ELSE claacuteusula PL SQL agreglo siguiente impliacutecita ELSEclaacuteusula

ELSE RAISE CASE_NOT_FOUND

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 719

Las excepciones planteadas durante la ejecucioacuten de una buacutesqueda CASE declaracioacuten se manejan dela manera habitual Es decir las paradas normales de ejecucioacuten y control se transfiere a la parte dcontrol de excepciones de PL SQL bloque o subprograma

Directrices para PL SQL Sentencias condicionales

Evite torpes IF declaraciones como las del siguiente ejemplo

SI minimum_balance saldo_nuevo ltENTONCESdescubierto = TRUEELSEdescubierto = falseEND IFSI descubierto = TRUE THENRAISE insufficient_fundsEND IF

Este coacutedigo no tiene en cuenta dos hechos uacutetiles En primer lugar el valor de una expresioacuten

booleana se pueden asignar directamente a una variable Boolean Por lo tanto puede reemplazar primera IF declaracioacuten con una simple asignacioacuten de la siguiente manera

descubierto = saldo_nuevo ltminimum_balance

En segundo lugar una variable booleana en siacute es verdadera o falsa Por lo tanto puede simplificala condicioacuten en la segunda IF declaracioacuten de la siguiente manera

SI ENTONCES descubierto

Cuando sea posible utilice el ELSIF claacuteusula en lugar de anidada IF declaraciones De esta manerel coacutedigo seraacute maacutes faacutecil de leer y entender Compare las siguientes IF declaraciones

SI ENTONCES condition1 | SI ENTONCES condition1sentencia1 | sentencia1ELSE | ELSIF condition2 ENTONCESSI ENTONCES condition2 | instruccioacuten2instruccioacuten2 | ELSIF Condition3 ENTONCESELSE | Sentencia3SI ENTONCES Condition3 | END IFSentencia3 |END IF |END IF |END IF |

Estas declaraciones son loacutegicamente equivalentes pero la primera declaracioacuten oscurece el flujo dla loacutegica mientras que la segunda declaracioacuten que revela

Si usted estaacute comparando una sola expresioacuten de varios valores se puede simplificar la loacutegicamediante el uso de un uacutenico CASE declaracioacuten en lugar de un IF con varios ELSIF claacuteusulas

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 819

Iterativo de control Las sentencias de bucle y EXIT

LOOP declaraciones permiten ejecutar una secuencia de instrucciones varias veces Hay tres formade LOOP declaraciones LOOP WHILE-LOOP y FOR-LOOP

LOOP

La forma maacutes simple de LOOP declaracioacuten es la base (o infinito) de bucle que incluye una secuencde sentencias entre las palabras clave LOOP y END LOOP como sigue

LOOPsequence_of_statementsEND LOOP

Con cada repeticioacuten del bucle la secuencia de instrucciones se ejecuta el control se reanuda en laparte superior del bucle Si el procesamiento adicional es indeseable o imposible puede utilizaruna EXIT declaracioacuten para completar el ciclo Usted puede colocar una o maacutes EXIT declaraciones e

cualquier lugar dentro de un bucle pero en ninguna parte fuera de un bucle Hay dos formasde EXIT declaraciones EXIT y EXIT-WHEN

SALIDA

La EXIT declaracioacuten fuerzas para completar un ciclo sin condiciones Cuando una EXIT se encuentla instruccioacuten el bucle finaliza inmediatamente y el control pasa a la siguiente instruccioacuten Unejemplo es el siguiente

LOOP

SI credit_rating lt3 entoncesEXIT - loop salir inmediatamenteEND IFEND LOOP- El control vuelve aquiacute

El siguiente ejemplo muestra que no se puede usar la EXIT declaracioacuten para completar un bloque SQL

COMENZAR

SI credit_rating lt3 entoncesEXIT - no se permiteEND IFEND

Recuerde la EXIT declaracioacuten debe ser colocado dentro de un bucle Para completar un bloque PLSQL antes de su finalizacioacuten normal se alcanza puede utilizar el RETURN comunicado Para maacutesinformacioacuten consulteUso de la instruccioacuten RETURN

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 919

EXIT-AL

El EXIT-WHEN declaracioacuten permite que un circuito completo de forma condicional Cuando la EXIT

encuentra la instruccioacuten la condicioacuten en la WHEN claacuteusula se evaluacutea Si la condicioacuten es verdadera ciclo se completa y el control pasa a la siguiente sentencia despueacutes del bucle Un ejemplo es elsiguiente

LOOPFETCH C1 EN SALIDA AL NOTFOUND c1 - bucle de salida si la condicioacuten es verdaderaEND LOOPCLOSE c1

Hasta que la condicioacuten es verdadera el bucle no se puede completar Por lo tanto una declaracioacutendentro del bucle debe cambiar el valor de la condicioacuten En el uacuteltimo ejemplo si el FETCH sentencidevuelve una fila la condicioacuten es falsa Cuando el FETCH declaracioacuten no devuelve una fila lacondicioacuten es verdadera el ciclo se completa y el control pasa a la CLOSE comunicado

El EXIT-WHEN declaracioacuten sustituye a un simple IF comunicado Por ejemplo compare las siguiendeclaraciones

Si el recuentogt 100 THEN | SALIDA CUANDO cuentagt 100EXIT |END IF |

Estas declaraciones son loacutegicamente equivalentes pero el EXIT-WHEN declaracioacuten es maacutes faacutecil deleer y entender

Etiquetas de bucle

Como bloques PL SQL loops pueden ser etiquetados La etiqueta un identificador no declaradocerrado entre pareacutentesis angulares dobles debe aparecer al principio de la LOOP declaracioacuten de lasiguiente manera

ltltlabel_namegtgtLOOPsequence_of_statementsEND LOOP

Opcionalmente el nombre de la etiqueta tambieacuten puede aparecer al final de la LOOP declaracioacutencomo muestra el siguiente ejemplo

ltltmy_loopgtgtLOOPEND LOOP my_loop

Al nidos marcados ciclos el uso final los nombres de etiqueta para mejorar la legibilidad

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1019

Con cualquier forma de EXIT declaracioacuten usted puede completar no soacutelo el lazo de corriente peroninguacuten lazo de inclusioacuten Simplemente la etiqueta del bucle encierra que desea completar Acontinuacioacuten utilice la etiqueta de una EXIT declaracioacuten de la siguiente manera

ltltoutergtgtLOOPLOOP

SALIDA exterior cuando - Salida de los dos buclesEND LOOPEND LOOP exterior

Cada adjuntando bucle hasta e incluyendo el bucle etiquetado se sale

Bucle while

El WHILE-LOOP socios la declaracioacuten de un estado con una secuencia de sentencias encerradas por

palabras clave LOOP y END LOOP como sigue

MIENTRAS condicioacuten de buclesequence_of_statementsEND LOOP

Antes de cada iteracioacuten del bucle se evaluacutea la condicioacuten Si la condicioacuten es verdadera la secuencde instrucciones se ejecuta el control se reanuda en la parte superior del bucle Si la condicioacuten esfalsa o nula el bucle se pasa por alto y el control pasa a la siguiente instruccioacuten Un ejemplo es elsiguiente

Mientras que el total lt= 25000 LOOPSELECCIONAR sal en el sueldo de EMP DONDE total = salario total +END LOOP

El nuacutemero de iteraciones depende de la condicioacuten y se desconoce hasta que el bucle termina Lacondicioacuten se comprueba en la parte superior del bucle por lo que la secuencia podriacutea ejecutar porcero En el uacuteltimo ejemplo si el valor inicial del total es mayor que 25000 la condicioacuten es falsael bucle se pasa por alto

Algunos idiomas tienen una LOOP UNTIL o REPEAT UNTIL estructura lo que prueba la condicioacuten en parte inferior del bucle en lugar de en la parte superior Por lo tanto la secuencia de instruccionesque se ejecuta al menos una vez PL SQL no tiene una estructura tal pero se puede construir unode la siguiente manera

LOOPsequence_of_statementsSALIDA AL boolean_expressionEND LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1119

Para asegurarse de que una WHILE bucle se ejecuta al menos una vez utilizar una variable Booleaninicializa en el estado de la siguiente manera

hecho = falseMIENTRAS NO hacer LOOPsequence_of_statementshecho = boolean_expressionEND LOOP

Una declaracioacuten dentro del bucle debe asignar un nuevo valor a la variable booleana De locontrario usted tiene un bucle infinito Por ejemplo el siguiente LOOP declaraciones sonloacutegicamente equivalentes

Bucle WHILE TRUE | LOOP | END LOOP | END LOOP

FOR-LOOP

Mientras que el nuacutemero de iteraciones a traveacutes de un WHILE bucle no se conoce hasta el bucletermina el nuacutemero de iteraciones a traveacutes de una FOR bucle se conoce antes de que el bucle seintroduce FOR bucles iterar a traveacutes de un rango especiacutefico de nuacutemeros enteros La gama es parteun esquema de iteracioacuten que estaacute rodeada por las palabras clave FOR y LOOP Un doble punto ( es el operador de rango La sintaxis es la siguiente

PARA contador en [atraacutes] lower_bound higher_bound LOOPsequence_of_statementsEND LOOP

La gama se evaluacutea cuando la FOR bucle se entroacute por primera vez y nunca volver a evaluarse

Como muestra el siguiente ejemplo la secuencia de instrucciones se ejecuta una vez para cadaentero en el rango Despueacutes de cada iteracioacuten el contador del bucle se incrementa

FOR i IN 1 3 LOOP - asignar los valores 123 para isequence_of_statements - ejecuta tres vecesEND LOOP

El siguiente ejemplo muestra que si el liacutemite inferior es igual a la mayor liacutemite la secuencia de

instrucciones se ejecuta una vez

FOR i IN 3 3 LOOP - asignar el valor 3 para isequence_of_statements - se ejecuta una vezEND LOOP

Por los ingresos por defecto la iteracioacuten hacia arriba de la cota inferior a los consolidados maacutesaltos Sin embargo como muestra el siguiente ejemplo si utiliza la palabra clave REVERSE proceiteracioacuten hacia abajo desde el alto obligado a la cota inferior Despueacutes de cada iteracioacuten el contad

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1219

del bucle se decrementa Sin embargo se escriben los liacutemites variacutean en orden ascendente (nodescendente)

FOR i IN REVERSE 1 3 LOOP - asignar los valores de 321 isequence_of_statements - ejecuta tres vecesEND LOOP

Dentro de una FOR bucle el contador del bucle se puede hacer referencia como una constante perno se puede asignar valores como muestra el siguiente ejemplo

PARA CTR en 1 10 LOOPSI NO ENTONCES terminadoINSERT INTO VALUES (ctr ) - legalfactor = ctr 2 - legalELSEctr = 10 - no se permiteEND IFEND LOOP

Esquemas de iteracioacuten

Los liacutemites de un rango de bucle puede ser literales variables o expresiones sino que debe evalua los nuacutemeros De lo contrario PL SQL lanza la excepcioacuten predefinida VALUE_ERROR El liacutemiteinferior no tiene que ser 1 como los ejemplos a continuacioacuten muestran Sin embargo el incremendel contador del bucle (o disminuir) debe ser 1

j EN -5 5k AL REVEacuteS primero uacuteltimapaso en 0 TRUNCAR (alto bajo) 2

Internamente PL SQL asigna los valores de los liacutemites temporales a PLS_INTEGER variables y sinecesario redondea los valores al entero maacutes cercano El rango de magnitud de un PLS_INTEGER ede -2 31 2 31 Por lo tanto si un liacutemite como resultado un nuacutemero fuera del rango seobtiene un error de desbordamiento numeacuterico cuando PL SQL los intentos de la asignacioacuten commuestra el siguiente ejemplo

DECLARENUacuteMERO hi = 2 32COMENZARPara j EN 1 LOOP hi - provoca un error de un desbordamiento numeacuterico

END LOOPEND

Algunos lenguajes proporcionan STEP claacuteusula que le permite especificar un incremento diferent(5 en vez de 1 por ejemplo) PL SQL no tiene una estructura tal pero se puede construiruno Dentro de la FOR bucle simplemente se multiplica cada referencia al contador del bucle por enuevo incremento En el siguiente ejemplo se asigna la fecha de hoy a los elementos de 5 10 y 1de un iacutendice por tabla

DECLARE

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1319

DateList TIPO ES LA MESA DEL IacuteNDICE DE FECHA POR BINARY_INTEGERfechas DateListINTEGER constante k = 5 - conjunto nuevo incrementoCOMENZARPara j EN 1 3 LOOPfechas (j k) = SYSDATE - se multiplican bucle contador incrementoEND LOOPEND

Rangos dinaacutemicos

PL SQL le permite determinar el rango de bucle de forma dinaacutemica en tiempo de ejecucioacuten commuestra el siguiente ejemplo

SELECT COUNT (empno) EN emp_count del EMPFOR i IN 1 LOOP emp_countEND LOOP

El valor de emp_count se desconoce en tiempo de compilacioacuten el SELECT instruccioacuten devuelve elvalor en tiempo de ejecucioacuten

iquestQueacute pasa si el liacutemite inferior de un rango de bucle evaluacutea a un entero mayor que el liacutemitesuperior Como muestra el siguiente ejemplo la secuencia de declaraciones dentro del bucle no sejecuta y el control pasa a la siguiente sentencia

- Liacutemite se convierte en unDE LOOP liacutemite i IN 2 sequence_of_statements - ejecuta cero vecesEND LOOP

- El control pasa aquiacute

Las reglas de aacutembito

El contador del bucle soacutelo se define dentro del bucle No se puede hacer referencia a eacutel fuera delbucle Despueacutes se sale del bucle el contador del bucle no estaacute definido como muestra el siguientejemplo

PARA CTR en 1 10 LOOPEND LOOPsuma = ctr - 1 - no se permite

Usted no necesita declarar expliacutecitamente el contador del bucle ya que se declara impliacutecitamentecomo una variable local de tipo INTEGER El siguiente ejemplo muestra que la declaracioacuten localoculta cualquier declaracioacuten global

DECLAREctr INTEGERCOMENZARPARA CTR en 1 25 LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1419

Si Ctrgt 10 THEN - Se refiere al contador del bucleEND LOOPEND

Para hacer referencia a la variable global en este ejemplo debe utilizar una etiqueta y la notacioacutenpuntos como sigue

ltltmaingtgtDECLAREctr INTEGERCOMENZARPARA CTR en 1 25 LOOPSI mainctrgt 10 THEN - se refiere a la variable globalEND IFEND LOOPEND principal

Las reglas del aacutembito mismo se aplica a anidar FOR bucles Considere el siguiente ejemplo Ambocontadores de bucles con el mismo nombre Por lo tanto para hacer referencia al contador del buexterno del bucle interno debe utilizar una etiqueta y la notacioacuten de puntos como sigue

ltltoutergtgtPara el paso en 1 25 LOOPPara el paso en 1 10 LOOPSI outerstepgt 15 ENTONCES END LOOP

END LOOP exterior

Utilizando la sentencia EXIT

La EXIT declaracioacuten permite una FOR vuelta completa antes de tiempo Por ejemplo el siguientebucle se ejecuta normalmente diez veces pero tan pronto como el FETCH declaracioacuten no devuelveuna fila el ciclo se completa no importa cuaacutentas veces se ha ejecutado

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA AL NOTFOUND c1

END LOOP

Suponga que usted debe salir de un anidados FOR bucle antes de tiempo Puede completar no soacutelolazo de corriente pero ninguacuten lazo de inclusioacuten Simplemente la etiqueta del bucle encierra quedesea completar A continuacioacuten utilice la etiqueta de una EXIT declaracioacuten para especificarqueacute FOR bucle de salida de la siguiente manera

ltltoutergtgtFOR i IN 1 5 LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1519

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA exterior cuando NOTFOUND c1 - salida tanto para los buclesEND LOOPEND LOOP exterior- El control pasa aquiacute

Secuencial de control GOTO y declaraciones NULL

A diferencia de la IF y LOOP declaraciones el GOTO y NULL declaraciones no son cruciales para PL SQL de programacioacuten La estructura de PL SQL es tal que el GOTO declaracioacuten es rara veznecesario De vez en cuando se puede simplificar la loacutegica suficiente como para justificar suuso La NULL declaracioacuten puede mejorar la legibilidad al hacer que el significado y la accioacuten de lasentencias condicionales claro

El uso excesivo de GOTO declaraciones puede generar un coacutedigo complejo no estructurada (a vecellamado spaghetti coacutedigo) que es difiacutecil de entender y mantener Por lo tanto el

uso GOTO declaraciones con moderacioacuten Por ejemplo para poder partir de una estructura anidadauna rutina de control de errores una excepcioacuten en lugar de utilizar un GOTO comunicado

GoTo

El GOTO ramas declaracioacuten a una etiqueta de manera incondicional La etiqueta debe ser uacutenico en alcance y debe preceder a una sentencia ejecutable o un bloque PL SQL Cuando se ejecutael GOTO transfiere el informe de control a la sentencia etiquetada o del bloque En el siguienteejemplo usted va a una sentencia ejecutable maacutes abajo en una secuencia de instrucciones

COMENZARGOTO insert_rowltltinsert_rowgtgtINSERT INTO VALORES emp END

En el siguiente ejemplo usted va a un bloque PL SQL maacutes arriba en una secuencia deinstrucciones

COMENZARltltupdate_rowgtgtCOMENZARACTUALIZACIOacuteN eacutenfasis JUEGO ENDGOTO update_rowEND

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1619

La etiqueta end_loop en el siguiente ejemplo no estaacute permitido porque no precede a una sentenciaejecutable

DECLAREhace booleanCOMENZARFOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgt - No se permiteEND LOOP - no es una sentencia ejecutableEND

Para depurar el uacuteltimo ejemplo soacutelo tiene que antildeadir el NULL declaracioacuten de la siguiente manera

FOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgtNULL - una sentencia ejecutableEND LOOP

Como muestra el siguiente ejemplo un GOTO declaracioacuten puede rama de un bloque que lo contiendesde el bloque actual

DECLAREmy_ename CHAR (10)COMENZARltltget_namegtgtSELECCIONAR Ename EN my_ename de EMP DONDE COMENZARObtiene_nombre GOTO - rama adjuntando bloqueENDEND

El GOTO ramas declaracioacuten al primer bloque encierra en el que la etiqueta se hace referencia apare

Restricciones

Algunos de los destinos posibles de un GOTO declaracioacuten no se permite En concretoun GOTO declaracioacuten no puede bifurcarse en un IF declaracioacuten CASE declaracioacuten LOOP declaracioacutensub-bloque Por ejemplo la siguiente GOTO declaracioacuten no se permite

COMENZARGOTO update_row - no se ramifican en IFSI ENTONCES vaacutelida

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1719

ltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

Como muestra el siguiente ejemplo un GOTO declaracioacuten no puede rama de un IF claacuteusula dedeclaracioacuten a otra Del mismo modo un GOTO declaracioacuten no puede rama deun CASE declaracioacuten WHEN claacuteusula a otra

COMENZARSI ENTONCES vaacutelidaGOTO update_row - no se ramifican en la claacuteusula ELSEELSEltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

El siguiente ejemplo muestra que un GOTO declaracioacuten no puede rama de un bloque que lo contienen un sub-bloque

COMENZARSi el estado = obsoletos THENGOTO delete_part - no se ramifican en sub-bloqueEND IFCOMENZAR

ltltdelete_partgtgtCANCELACIOacuteN de piezas en las ENDEND

Ademaacutes un GOTO declaracioacuten no puede ramificar hacia fuera de un subprograma como muestra esiguiente ejemplo

DECLARE

PROCEDIMIENTO compute_bonus (NUacuteMERO emp_id) ESCOMENZARGOTO update_row - no se puede ramificar hacia fuera del subprogramaENDCOMENZARltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1819

Por uacuteltimo un GOTO declaracioacuten no puede rama de un manejador de excepcioacuten en el bloqueactual Por ejemplo la siguiente GOTO declaracioacuten no se permite

DECLAREpe_ratio REALCOMENZARSelecciona el precio NVL (ingresos 0) en pe_ratio DE

ltltinsert_rowgtgtINSERT INTO VALORES Estadiacutesticas (pe_ratio )EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEpe_ratio = 0GOTO insert_row - no se puede poder en el bloque actualEND

Sin embargo un GOTO declaracioacuten puede rama de un manejador de excepciones en un bloque que contiene

Declaracioacuten de NULL

La NULL declaracioacuten no hace otra cosa que el control pase a la siguiente instruccioacuten En unconstructor condicional el NULL declaracioacuten dice a los lectores la posibilidad de que se haconsiderado pero no hay accioacuten que sea necesaria En el siguiente ejemplo el NULL declaracioacutendemuestra que no se toman medidas de excepcioacuten sin nombre

EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEROLLBACKCUANDO ENTONCES VALUE_ERROR

INSERT INTO VALORES errores COMMITCUANDO OTROS ENTONCESNULLEND

En IF las declaraciones u otros lugares que requieren por lo menos una sentencia ejecutableel NULL declaracioacuten para satisfacer a la sintaxis En el siguiente ejemplo el NULL declaracioacuten hacehincapieacute en que soacutelo los mejores empleados reciban bonificaciones

Si la calificacioacutengt 90 THEN

compute_bonus (emp_id)ELSENULLEND IF

Ademaacutes el NULL declaracioacuten es una forma praacutectica para crear recibos de la hora de disentildearaplicaciones de arriba hacia abajo Un taloacuten se subprograma ficticio que le permite diferir ladefinicioacuten de un procedimiento o funcioacuten hasta que probar y depurar el programa principal En elsiguiente ejemplo el NULL declaracioacuten cumple con el requisito de que al menos una declaracioacutendebe aparecer en la parte ejecutable de un subprograma

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1919

PROCEDIMIENTO debit_account (acct_id INTEGER REAL cantidad) ESCOMENZARNULLEND debit_account

Copyright copy 1996 2002 Oracle Corporation Todos los derechos reservados

Casa

Lista delibros

Contenido

Iacutendice

MasterIndex

Realiment

Page 7: programacion oracle

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 719

Las excepciones planteadas durante la ejecucioacuten de una buacutesqueda CASE declaracioacuten se manejan dela manera habitual Es decir las paradas normales de ejecucioacuten y control se transfiere a la parte dcontrol de excepciones de PL SQL bloque o subprograma

Directrices para PL SQL Sentencias condicionales

Evite torpes IF declaraciones como las del siguiente ejemplo

SI minimum_balance saldo_nuevo ltENTONCESdescubierto = TRUEELSEdescubierto = falseEND IFSI descubierto = TRUE THENRAISE insufficient_fundsEND IF

Este coacutedigo no tiene en cuenta dos hechos uacutetiles En primer lugar el valor de una expresioacuten

booleana se pueden asignar directamente a una variable Boolean Por lo tanto puede reemplazar primera IF declaracioacuten con una simple asignacioacuten de la siguiente manera

descubierto = saldo_nuevo ltminimum_balance

En segundo lugar una variable booleana en siacute es verdadera o falsa Por lo tanto puede simplificala condicioacuten en la segunda IF declaracioacuten de la siguiente manera

SI ENTONCES descubierto

Cuando sea posible utilice el ELSIF claacuteusula en lugar de anidada IF declaraciones De esta manerel coacutedigo seraacute maacutes faacutecil de leer y entender Compare las siguientes IF declaraciones

SI ENTONCES condition1 | SI ENTONCES condition1sentencia1 | sentencia1ELSE | ELSIF condition2 ENTONCESSI ENTONCES condition2 | instruccioacuten2instruccioacuten2 | ELSIF Condition3 ENTONCESELSE | Sentencia3SI ENTONCES Condition3 | END IFSentencia3 |END IF |END IF |END IF |

Estas declaraciones son loacutegicamente equivalentes pero la primera declaracioacuten oscurece el flujo dla loacutegica mientras que la segunda declaracioacuten que revela

Si usted estaacute comparando una sola expresioacuten de varios valores se puede simplificar la loacutegicamediante el uso de un uacutenico CASE declaracioacuten en lugar de un IF con varios ELSIF claacuteusulas

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 819

Iterativo de control Las sentencias de bucle y EXIT

LOOP declaraciones permiten ejecutar una secuencia de instrucciones varias veces Hay tres formade LOOP declaraciones LOOP WHILE-LOOP y FOR-LOOP

LOOP

La forma maacutes simple de LOOP declaracioacuten es la base (o infinito) de bucle que incluye una secuencde sentencias entre las palabras clave LOOP y END LOOP como sigue

LOOPsequence_of_statementsEND LOOP

Con cada repeticioacuten del bucle la secuencia de instrucciones se ejecuta el control se reanuda en laparte superior del bucle Si el procesamiento adicional es indeseable o imposible puede utilizaruna EXIT declaracioacuten para completar el ciclo Usted puede colocar una o maacutes EXIT declaraciones e

cualquier lugar dentro de un bucle pero en ninguna parte fuera de un bucle Hay dos formasde EXIT declaraciones EXIT y EXIT-WHEN

SALIDA

La EXIT declaracioacuten fuerzas para completar un ciclo sin condiciones Cuando una EXIT se encuentla instruccioacuten el bucle finaliza inmediatamente y el control pasa a la siguiente instruccioacuten Unejemplo es el siguiente

LOOP

SI credit_rating lt3 entoncesEXIT - loop salir inmediatamenteEND IFEND LOOP- El control vuelve aquiacute

El siguiente ejemplo muestra que no se puede usar la EXIT declaracioacuten para completar un bloque SQL

COMENZAR

SI credit_rating lt3 entoncesEXIT - no se permiteEND IFEND

Recuerde la EXIT declaracioacuten debe ser colocado dentro de un bucle Para completar un bloque PLSQL antes de su finalizacioacuten normal se alcanza puede utilizar el RETURN comunicado Para maacutesinformacioacuten consulteUso de la instruccioacuten RETURN

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 919

EXIT-AL

El EXIT-WHEN declaracioacuten permite que un circuito completo de forma condicional Cuando la EXIT

encuentra la instruccioacuten la condicioacuten en la WHEN claacuteusula se evaluacutea Si la condicioacuten es verdadera ciclo se completa y el control pasa a la siguiente sentencia despueacutes del bucle Un ejemplo es elsiguiente

LOOPFETCH C1 EN SALIDA AL NOTFOUND c1 - bucle de salida si la condicioacuten es verdaderaEND LOOPCLOSE c1

Hasta que la condicioacuten es verdadera el bucle no se puede completar Por lo tanto una declaracioacutendentro del bucle debe cambiar el valor de la condicioacuten En el uacuteltimo ejemplo si el FETCH sentencidevuelve una fila la condicioacuten es falsa Cuando el FETCH declaracioacuten no devuelve una fila lacondicioacuten es verdadera el ciclo se completa y el control pasa a la CLOSE comunicado

El EXIT-WHEN declaracioacuten sustituye a un simple IF comunicado Por ejemplo compare las siguiendeclaraciones

Si el recuentogt 100 THEN | SALIDA CUANDO cuentagt 100EXIT |END IF |

Estas declaraciones son loacutegicamente equivalentes pero el EXIT-WHEN declaracioacuten es maacutes faacutecil deleer y entender

Etiquetas de bucle

Como bloques PL SQL loops pueden ser etiquetados La etiqueta un identificador no declaradocerrado entre pareacutentesis angulares dobles debe aparecer al principio de la LOOP declaracioacuten de lasiguiente manera

ltltlabel_namegtgtLOOPsequence_of_statementsEND LOOP

Opcionalmente el nombre de la etiqueta tambieacuten puede aparecer al final de la LOOP declaracioacutencomo muestra el siguiente ejemplo

ltltmy_loopgtgtLOOPEND LOOP my_loop

Al nidos marcados ciclos el uso final los nombres de etiqueta para mejorar la legibilidad

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1019

Con cualquier forma de EXIT declaracioacuten usted puede completar no soacutelo el lazo de corriente peroninguacuten lazo de inclusioacuten Simplemente la etiqueta del bucle encierra que desea completar Acontinuacioacuten utilice la etiqueta de una EXIT declaracioacuten de la siguiente manera

ltltoutergtgtLOOPLOOP

SALIDA exterior cuando - Salida de los dos buclesEND LOOPEND LOOP exterior

Cada adjuntando bucle hasta e incluyendo el bucle etiquetado se sale

Bucle while

El WHILE-LOOP socios la declaracioacuten de un estado con una secuencia de sentencias encerradas por

palabras clave LOOP y END LOOP como sigue

MIENTRAS condicioacuten de buclesequence_of_statementsEND LOOP

Antes de cada iteracioacuten del bucle se evaluacutea la condicioacuten Si la condicioacuten es verdadera la secuencde instrucciones se ejecuta el control se reanuda en la parte superior del bucle Si la condicioacuten esfalsa o nula el bucle se pasa por alto y el control pasa a la siguiente instruccioacuten Un ejemplo es elsiguiente

Mientras que el total lt= 25000 LOOPSELECCIONAR sal en el sueldo de EMP DONDE total = salario total +END LOOP

El nuacutemero de iteraciones depende de la condicioacuten y se desconoce hasta que el bucle termina Lacondicioacuten se comprueba en la parte superior del bucle por lo que la secuencia podriacutea ejecutar porcero En el uacuteltimo ejemplo si el valor inicial del total es mayor que 25000 la condicioacuten es falsael bucle se pasa por alto

Algunos idiomas tienen una LOOP UNTIL o REPEAT UNTIL estructura lo que prueba la condicioacuten en parte inferior del bucle en lugar de en la parte superior Por lo tanto la secuencia de instruccionesque se ejecuta al menos una vez PL SQL no tiene una estructura tal pero se puede construir unode la siguiente manera

LOOPsequence_of_statementsSALIDA AL boolean_expressionEND LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1119

Para asegurarse de que una WHILE bucle se ejecuta al menos una vez utilizar una variable Booleaninicializa en el estado de la siguiente manera

hecho = falseMIENTRAS NO hacer LOOPsequence_of_statementshecho = boolean_expressionEND LOOP

Una declaracioacuten dentro del bucle debe asignar un nuevo valor a la variable booleana De locontrario usted tiene un bucle infinito Por ejemplo el siguiente LOOP declaraciones sonloacutegicamente equivalentes

Bucle WHILE TRUE | LOOP | END LOOP | END LOOP

FOR-LOOP

Mientras que el nuacutemero de iteraciones a traveacutes de un WHILE bucle no se conoce hasta el bucletermina el nuacutemero de iteraciones a traveacutes de una FOR bucle se conoce antes de que el bucle seintroduce FOR bucles iterar a traveacutes de un rango especiacutefico de nuacutemeros enteros La gama es parteun esquema de iteracioacuten que estaacute rodeada por las palabras clave FOR y LOOP Un doble punto ( es el operador de rango La sintaxis es la siguiente

PARA contador en [atraacutes] lower_bound higher_bound LOOPsequence_of_statementsEND LOOP

La gama se evaluacutea cuando la FOR bucle se entroacute por primera vez y nunca volver a evaluarse

Como muestra el siguiente ejemplo la secuencia de instrucciones se ejecuta una vez para cadaentero en el rango Despueacutes de cada iteracioacuten el contador del bucle se incrementa

FOR i IN 1 3 LOOP - asignar los valores 123 para isequence_of_statements - ejecuta tres vecesEND LOOP

El siguiente ejemplo muestra que si el liacutemite inferior es igual a la mayor liacutemite la secuencia de

instrucciones se ejecuta una vez

FOR i IN 3 3 LOOP - asignar el valor 3 para isequence_of_statements - se ejecuta una vezEND LOOP

Por los ingresos por defecto la iteracioacuten hacia arriba de la cota inferior a los consolidados maacutesaltos Sin embargo como muestra el siguiente ejemplo si utiliza la palabra clave REVERSE proceiteracioacuten hacia abajo desde el alto obligado a la cota inferior Despueacutes de cada iteracioacuten el contad

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1219

del bucle se decrementa Sin embargo se escriben los liacutemites variacutean en orden ascendente (nodescendente)

FOR i IN REVERSE 1 3 LOOP - asignar los valores de 321 isequence_of_statements - ejecuta tres vecesEND LOOP

Dentro de una FOR bucle el contador del bucle se puede hacer referencia como una constante perno se puede asignar valores como muestra el siguiente ejemplo

PARA CTR en 1 10 LOOPSI NO ENTONCES terminadoINSERT INTO VALUES (ctr ) - legalfactor = ctr 2 - legalELSEctr = 10 - no se permiteEND IFEND LOOP

Esquemas de iteracioacuten

Los liacutemites de un rango de bucle puede ser literales variables o expresiones sino que debe evalua los nuacutemeros De lo contrario PL SQL lanza la excepcioacuten predefinida VALUE_ERROR El liacutemiteinferior no tiene que ser 1 como los ejemplos a continuacioacuten muestran Sin embargo el incremendel contador del bucle (o disminuir) debe ser 1

j EN -5 5k AL REVEacuteS primero uacuteltimapaso en 0 TRUNCAR (alto bajo) 2

Internamente PL SQL asigna los valores de los liacutemites temporales a PLS_INTEGER variables y sinecesario redondea los valores al entero maacutes cercano El rango de magnitud de un PLS_INTEGER ede -2 31 2 31 Por lo tanto si un liacutemite como resultado un nuacutemero fuera del rango seobtiene un error de desbordamiento numeacuterico cuando PL SQL los intentos de la asignacioacuten commuestra el siguiente ejemplo

DECLARENUacuteMERO hi = 2 32COMENZARPara j EN 1 LOOP hi - provoca un error de un desbordamiento numeacuterico

END LOOPEND

Algunos lenguajes proporcionan STEP claacuteusula que le permite especificar un incremento diferent(5 en vez de 1 por ejemplo) PL SQL no tiene una estructura tal pero se puede construiruno Dentro de la FOR bucle simplemente se multiplica cada referencia al contador del bucle por enuevo incremento En el siguiente ejemplo se asigna la fecha de hoy a los elementos de 5 10 y 1de un iacutendice por tabla

DECLARE

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1319

DateList TIPO ES LA MESA DEL IacuteNDICE DE FECHA POR BINARY_INTEGERfechas DateListINTEGER constante k = 5 - conjunto nuevo incrementoCOMENZARPara j EN 1 3 LOOPfechas (j k) = SYSDATE - se multiplican bucle contador incrementoEND LOOPEND

Rangos dinaacutemicos

PL SQL le permite determinar el rango de bucle de forma dinaacutemica en tiempo de ejecucioacuten commuestra el siguiente ejemplo

SELECT COUNT (empno) EN emp_count del EMPFOR i IN 1 LOOP emp_countEND LOOP

El valor de emp_count se desconoce en tiempo de compilacioacuten el SELECT instruccioacuten devuelve elvalor en tiempo de ejecucioacuten

iquestQueacute pasa si el liacutemite inferior de un rango de bucle evaluacutea a un entero mayor que el liacutemitesuperior Como muestra el siguiente ejemplo la secuencia de declaraciones dentro del bucle no sejecuta y el control pasa a la siguiente sentencia

- Liacutemite se convierte en unDE LOOP liacutemite i IN 2 sequence_of_statements - ejecuta cero vecesEND LOOP

- El control pasa aquiacute

Las reglas de aacutembito

El contador del bucle soacutelo se define dentro del bucle No se puede hacer referencia a eacutel fuera delbucle Despueacutes se sale del bucle el contador del bucle no estaacute definido como muestra el siguientejemplo

PARA CTR en 1 10 LOOPEND LOOPsuma = ctr - 1 - no se permite

Usted no necesita declarar expliacutecitamente el contador del bucle ya que se declara impliacutecitamentecomo una variable local de tipo INTEGER El siguiente ejemplo muestra que la declaracioacuten localoculta cualquier declaracioacuten global

DECLAREctr INTEGERCOMENZARPARA CTR en 1 25 LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1419

Si Ctrgt 10 THEN - Se refiere al contador del bucleEND LOOPEND

Para hacer referencia a la variable global en este ejemplo debe utilizar una etiqueta y la notacioacutenpuntos como sigue

ltltmaingtgtDECLAREctr INTEGERCOMENZARPARA CTR en 1 25 LOOPSI mainctrgt 10 THEN - se refiere a la variable globalEND IFEND LOOPEND principal

Las reglas del aacutembito mismo se aplica a anidar FOR bucles Considere el siguiente ejemplo Ambocontadores de bucles con el mismo nombre Por lo tanto para hacer referencia al contador del buexterno del bucle interno debe utilizar una etiqueta y la notacioacuten de puntos como sigue

ltltoutergtgtPara el paso en 1 25 LOOPPara el paso en 1 10 LOOPSI outerstepgt 15 ENTONCES END LOOP

END LOOP exterior

Utilizando la sentencia EXIT

La EXIT declaracioacuten permite una FOR vuelta completa antes de tiempo Por ejemplo el siguientebucle se ejecuta normalmente diez veces pero tan pronto como el FETCH declaracioacuten no devuelveuna fila el ciclo se completa no importa cuaacutentas veces se ha ejecutado

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA AL NOTFOUND c1

END LOOP

Suponga que usted debe salir de un anidados FOR bucle antes de tiempo Puede completar no soacutelolazo de corriente pero ninguacuten lazo de inclusioacuten Simplemente la etiqueta del bucle encierra quedesea completar A continuacioacuten utilice la etiqueta de una EXIT declaracioacuten para especificarqueacute FOR bucle de salida de la siguiente manera

ltltoutergtgtFOR i IN 1 5 LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1519

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA exterior cuando NOTFOUND c1 - salida tanto para los buclesEND LOOPEND LOOP exterior- El control pasa aquiacute

Secuencial de control GOTO y declaraciones NULL

A diferencia de la IF y LOOP declaraciones el GOTO y NULL declaraciones no son cruciales para PL SQL de programacioacuten La estructura de PL SQL es tal que el GOTO declaracioacuten es rara veznecesario De vez en cuando se puede simplificar la loacutegica suficiente como para justificar suuso La NULL declaracioacuten puede mejorar la legibilidad al hacer que el significado y la accioacuten de lasentencias condicionales claro

El uso excesivo de GOTO declaraciones puede generar un coacutedigo complejo no estructurada (a vecellamado spaghetti coacutedigo) que es difiacutecil de entender y mantener Por lo tanto el

uso GOTO declaraciones con moderacioacuten Por ejemplo para poder partir de una estructura anidadauna rutina de control de errores una excepcioacuten en lugar de utilizar un GOTO comunicado

GoTo

El GOTO ramas declaracioacuten a una etiqueta de manera incondicional La etiqueta debe ser uacutenico en alcance y debe preceder a una sentencia ejecutable o un bloque PL SQL Cuando se ejecutael GOTO transfiere el informe de control a la sentencia etiquetada o del bloque En el siguienteejemplo usted va a una sentencia ejecutable maacutes abajo en una secuencia de instrucciones

COMENZARGOTO insert_rowltltinsert_rowgtgtINSERT INTO VALORES emp END

En el siguiente ejemplo usted va a un bloque PL SQL maacutes arriba en una secuencia deinstrucciones

COMENZARltltupdate_rowgtgtCOMENZARACTUALIZACIOacuteN eacutenfasis JUEGO ENDGOTO update_rowEND

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1619

La etiqueta end_loop en el siguiente ejemplo no estaacute permitido porque no precede a una sentenciaejecutable

DECLAREhace booleanCOMENZARFOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgt - No se permiteEND LOOP - no es una sentencia ejecutableEND

Para depurar el uacuteltimo ejemplo soacutelo tiene que antildeadir el NULL declaracioacuten de la siguiente manera

FOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgtNULL - una sentencia ejecutableEND LOOP

Como muestra el siguiente ejemplo un GOTO declaracioacuten puede rama de un bloque que lo contiendesde el bloque actual

DECLAREmy_ename CHAR (10)COMENZARltltget_namegtgtSELECCIONAR Ename EN my_ename de EMP DONDE COMENZARObtiene_nombre GOTO - rama adjuntando bloqueENDEND

El GOTO ramas declaracioacuten al primer bloque encierra en el que la etiqueta se hace referencia apare

Restricciones

Algunos de los destinos posibles de un GOTO declaracioacuten no se permite En concretoun GOTO declaracioacuten no puede bifurcarse en un IF declaracioacuten CASE declaracioacuten LOOP declaracioacutensub-bloque Por ejemplo la siguiente GOTO declaracioacuten no se permite

COMENZARGOTO update_row - no se ramifican en IFSI ENTONCES vaacutelida

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1719

ltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

Como muestra el siguiente ejemplo un GOTO declaracioacuten no puede rama de un IF claacuteusula dedeclaracioacuten a otra Del mismo modo un GOTO declaracioacuten no puede rama deun CASE declaracioacuten WHEN claacuteusula a otra

COMENZARSI ENTONCES vaacutelidaGOTO update_row - no se ramifican en la claacuteusula ELSEELSEltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

El siguiente ejemplo muestra que un GOTO declaracioacuten no puede rama de un bloque que lo contienen un sub-bloque

COMENZARSi el estado = obsoletos THENGOTO delete_part - no se ramifican en sub-bloqueEND IFCOMENZAR

ltltdelete_partgtgtCANCELACIOacuteN de piezas en las ENDEND

Ademaacutes un GOTO declaracioacuten no puede ramificar hacia fuera de un subprograma como muestra esiguiente ejemplo

DECLARE

PROCEDIMIENTO compute_bonus (NUacuteMERO emp_id) ESCOMENZARGOTO update_row - no se puede ramificar hacia fuera del subprogramaENDCOMENZARltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1819

Por uacuteltimo un GOTO declaracioacuten no puede rama de un manejador de excepcioacuten en el bloqueactual Por ejemplo la siguiente GOTO declaracioacuten no se permite

DECLAREpe_ratio REALCOMENZARSelecciona el precio NVL (ingresos 0) en pe_ratio DE

ltltinsert_rowgtgtINSERT INTO VALORES Estadiacutesticas (pe_ratio )EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEpe_ratio = 0GOTO insert_row - no se puede poder en el bloque actualEND

Sin embargo un GOTO declaracioacuten puede rama de un manejador de excepciones en un bloque que contiene

Declaracioacuten de NULL

La NULL declaracioacuten no hace otra cosa que el control pase a la siguiente instruccioacuten En unconstructor condicional el NULL declaracioacuten dice a los lectores la posibilidad de que se haconsiderado pero no hay accioacuten que sea necesaria En el siguiente ejemplo el NULL declaracioacutendemuestra que no se toman medidas de excepcioacuten sin nombre

EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEROLLBACKCUANDO ENTONCES VALUE_ERROR

INSERT INTO VALORES errores COMMITCUANDO OTROS ENTONCESNULLEND

En IF las declaraciones u otros lugares que requieren por lo menos una sentencia ejecutableel NULL declaracioacuten para satisfacer a la sintaxis En el siguiente ejemplo el NULL declaracioacuten hacehincapieacute en que soacutelo los mejores empleados reciban bonificaciones

Si la calificacioacutengt 90 THEN

compute_bonus (emp_id)ELSENULLEND IF

Ademaacutes el NULL declaracioacuten es una forma praacutectica para crear recibos de la hora de disentildearaplicaciones de arriba hacia abajo Un taloacuten se subprograma ficticio que le permite diferir ladefinicioacuten de un procedimiento o funcioacuten hasta que probar y depurar el programa principal En elsiguiente ejemplo el NULL declaracioacuten cumple con el requisito de que al menos una declaracioacutendebe aparecer en la parte ejecutable de un subprograma

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1919

PROCEDIMIENTO debit_account (acct_id INTEGER REAL cantidad) ESCOMENZARNULLEND debit_account

Copyright copy 1996 2002 Oracle Corporation Todos los derechos reservados

Casa

Lista delibros

Contenido

Iacutendice

MasterIndex

Realiment

Page 8: programacion oracle

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 819

Iterativo de control Las sentencias de bucle y EXIT

LOOP declaraciones permiten ejecutar una secuencia de instrucciones varias veces Hay tres formade LOOP declaraciones LOOP WHILE-LOOP y FOR-LOOP

LOOP

La forma maacutes simple de LOOP declaracioacuten es la base (o infinito) de bucle que incluye una secuencde sentencias entre las palabras clave LOOP y END LOOP como sigue

LOOPsequence_of_statementsEND LOOP

Con cada repeticioacuten del bucle la secuencia de instrucciones se ejecuta el control se reanuda en laparte superior del bucle Si el procesamiento adicional es indeseable o imposible puede utilizaruna EXIT declaracioacuten para completar el ciclo Usted puede colocar una o maacutes EXIT declaraciones e

cualquier lugar dentro de un bucle pero en ninguna parte fuera de un bucle Hay dos formasde EXIT declaraciones EXIT y EXIT-WHEN

SALIDA

La EXIT declaracioacuten fuerzas para completar un ciclo sin condiciones Cuando una EXIT se encuentla instruccioacuten el bucle finaliza inmediatamente y el control pasa a la siguiente instruccioacuten Unejemplo es el siguiente

LOOP

SI credit_rating lt3 entoncesEXIT - loop salir inmediatamenteEND IFEND LOOP- El control vuelve aquiacute

El siguiente ejemplo muestra que no se puede usar la EXIT declaracioacuten para completar un bloque SQL

COMENZAR

SI credit_rating lt3 entoncesEXIT - no se permiteEND IFEND

Recuerde la EXIT declaracioacuten debe ser colocado dentro de un bucle Para completar un bloque PLSQL antes de su finalizacioacuten normal se alcanza puede utilizar el RETURN comunicado Para maacutesinformacioacuten consulteUso de la instruccioacuten RETURN

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 919

EXIT-AL

El EXIT-WHEN declaracioacuten permite que un circuito completo de forma condicional Cuando la EXIT

encuentra la instruccioacuten la condicioacuten en la WHEN claacuteusula se evaluacutea Si la condicioacuten es verdadera ciclo se completa y el control pasa a la siguiente sentencia despueacutes del bucle Un ejemplo es elsiguiente

LOOPFETCH C1 EN SALIDA AL NOTFOUND c1 - bucle de salida si la condicioacuten es verdaderaEND LOOPCLOSE c1

Hasta que la condicioacuten es verdadera el bucle no se puede completar Por lo tanto una declaracioacutendentro del bucle debe cambiar el valor de la condicioacuten En el uacuteltimo ejemplo si el FETCH sentencidevuelve una fila la condicioacuten es falsa Cuando el FETCH declaracioacuten no devuelve una fila lacondicioacuten es verdadera el ciclo se completa y el control pasa a la CLOSE comunicado

El EXIT-WHEN declaracioacuten sustituye a un simple IF comunicado Por ejemplo compare las siguiendeclaraciones

Si el recuentogt 100 THEN | SALIDA CUANDO cuentagt 100EXIT |END IF |

Estas declaraciones son loacutegicamente equivalentes pero el EXIT-WHEN declaracioacuten es maacutes faacutecil deleer y entender

Etiquetas de bucle

Como bloques PL SQL loops pueden ser etiquetados La etiqueta un identificador no declaradocerrado entre pareacutentesis angulares dobles debe aparecer al principio de la LOOP declaracioacuten de lasiguiente manera

ltltlabel_namegtgtLOOPsequence_of_statementsEND LOOP

Opcionalmente el nombre de la etiqueta tambieacuten puede aparecer al final de la LOOP declaracioacutencomo muestra el siguiente ejemplo

ltltmy_loopgtgtLOOPEND LOOP my_loop

Al nidos marcados ciclos el uso final los nombres de etiqueta para mejorar la legibilidad

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1019

Con cualquier forma de EXIT declaracioacuten usted puede completar no soacutelo el lazo de corriente peroninguacuten lazo de inclusioacuten Simplemente la etiqueta del bucle encierra que desea completar Acontinuacioacuten utilice la etiqueta de una EXIT declaracioacuten de la siguiente manera

ltltoutergtgtLOOPLOOP

SALIDA exterior cuando - Salida de los dos buclesEND LOOPEND LOOP exterior

Cada adjuntando bucle hasta e incluyendo el bucle etiquetado se sale

Bucle while

El WHILE-LOOP socios la declaracioacuten de un estado con una secuencia de sentencias encerradas por

palabras clave LOOP y END LOOP como sigue

MIENTRAS condicioacuten de buclesequence_of_statementsEND LOOP

Antes de cada iteracioacuten del bucle se evaluacutea la condicioacuten Si la condicioacuten es verdadera la secuencde instrucciones se ejecuta el control se reanuda en la parte superior del bucle Si la condicioacuten esfalsa o nula el bucle se pasa por alto y el control pasa a la siguiente instruccioacuten Un ejemplo es elsiguiente

Mientras que el total lt= 25000 LOOPSELECCIONAR sal en el sueldo de EMP DONDE total = salario total +END LOOP

El nuacutemero de iteraciones depende de la condicioacuten y se desconoce hasta que el bucle termina Lacondicioacuten se comprueba en la parte superior del bucle por lo que la secuencia podriacutea ejecutar porcero En el uacuteltimo ejemplo si el valor inicial del total es mayor que 25000 la condicioacuten es falsael bucle se pasa por alto

Algunos idiomas tienen una LOOP UNTIL o REPEAT UNTIL estructura lo que prueba la condicioacuten en parte inferior del bucle en lugar de en la parte superior Por lo tanto la secuencia de instruccionesque se ejecuta al menos una vez PL SQL no tiene una estructura tal pero se puede construir unode la siguiente manera

LOOPsequence_of_statementsSALIDA AL boolean_expressionEND LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1119

Para asegurarse de que una WHILE bucle se ejecuta al menos una vez utilizar una variable Booleaninicializa en el estado de la siguiente manera

hecho = falseMIENTRAS NO hacer LOOPsequence_of_statementshecho = boolean_expressionEND LOOP

Una declaracioacuten dentro del bucle debe asignar un nuevo valor a la variable booleana De locontrario usted tiene un bucle infinito Por ejemplo el siguiente LOOP declaraciones sonloacutegicamente equivalentes

Bucle WHILE TRUE | LOOP | END LOOP | END LOOP

FOR-LOOP

Mientras que el nuacutemero de iteraciones a traveacutes de un WHILE bucle no se conoce hasta el bucletermina el nuacutemero de iteraciones a traveacutes de una FOR bucle se conoce antes de que el bucle seintroduce FOR bucles iterar a traveacutes de un rango especiacutefico de nuacutemeros enteros La gama es parteun esquema de iteracioacuten que estaacute rodeada por las palabras clave FOR y LOOP Un doble punto ( es el operador de rango La sintaxis es la siguiente

PARA contador en [atraacutes] lower_bound higher_bound LOOPsequence_of_statementsEND LOOP

La gama se evaluacutea cuando la FOR bucle se entroacute por primera vez y nunca volver a evaluarse

Como muestra el siguiente ejemplo la secuencia de instrucciones se ejecuta una vez para cadaentero en el rango Despueacutes de cada iteracioacuten el contador del bucle se incrementa

FOR i IN 1 3 LOOP - asignar los valores 123 para isequence_of_statements - ejecuta tres vecesEND LOOP

El siguiente ejemplo muestra que si el liacutemite inferior es igual a la mayor liacutemite la secuencia de

instrucciones se ejecuta una vez

FOR i IN 3 3 LOOP - asignar el valor 3 para isequence_of_statements - se ejecuta una vezEND LOOP

Por los ingresos por defecto la iteracioacuten hacia arriba de la cota inferior a los consolidados maacutesaltos Sin embargo como muestra el siguiente ejemplo si utiliza la palabra clave REVERSE proceiteracioacuten hacia abajo desde el alto obligado a la cota inferior Despueacutes de cada iteracioacuten el contad

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1219

del bucle se decrementa Sin embargo se escriben los liacutemites variacutean en orden ascendente (nodescendente)

FOR i IN REVERSE 1 3 LOOP - asignar los valores de 321 isequence_of_statements - ejecuta tres vecesEND LOOP

Dentro de una FOR bucle el contador del bucle se puede hacer referencia como una constante perno se puede asignar valores como muestra el siguiente ejemplo

PARA CTR en 1 10 LOOPSI NO ENTONCES terminadoINSERT INTO VALUES (ctr ) - legalfactor = ctr 2 - legalELSEctr = 10 - no se permiteEND IFEND LOOP

Esquemas de iteracioacuten

Los liacutemites de un rango de bucle puede ser literales variables o expresiones sino que debe evalua los nuacutemeros De lo contrario PL SQL lanza la excepcioacuten predefinida VALUE_ERROR El liacutemiteinferior no tiene que ser 1 como los ejemplos a continuacioacuten muestran Sin embargo el incremendel contador del bucle (o disminuir) debe ser 1

j EN -5 5k AL REVEacuteS primero uacuteltimapaso en 0 TRUNCAR (alto bajo) 2

Internamente PL SQL asigna los valores de los liacutemites temporales a PLS_INTEGER variables y sinecesario redondea los valores al entero maacutes cercano El rango de magnitud de un PLS_INTEGER ede -2 31 2 31 Por lo tanto si un liacutemite como resultado un nuacutemero fuera del rango seobtiene un error de desbordamiento numeacuterico cuando PL SQL los intentos de la asignacioacuten commuestra el siguiente ejemplo

DECLARENUacuteMERO hi = 2 32COMENZARPara j EN 1 LOOP hi - provoca un error de un desbordamiento numeacuterico

END LOOPEND

Algunos lenguajes proporcionan STEP claacuteusula que le permite especificar un incremento diferent(5 en vez de 1 por ejemplo) PL SQL no tiene una estructura tal pero se puede construiruno Dentro de la FOR bucle simplemente se multiplica cada referencia al contador del bucle por enuevo incremento En el siguiente ejemplo se asigna la fecha de hoy a los elementos de 5 10 y 1de un iacutendice por tabla

DECLARE

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1319

DateList TIPO ES LA MESA DEL IacuteNDICE DE FECHA POR BINARY_INTEGERfechas DateListINTEGER constante k = 5 - conjunto nuevo incrementoCOMENZARPara j EN 1 3 LOOPfechas (j k) = SYSDATE - se multiplican bucle contador incrementoEND LOOPEND

Rangos dinaacutemicos

PL SQL le permite determinar el rango de bucle de forma dinaacutemica en tiempo de ejecucioacuten commuestra el siguiente ejemplo

SELECT COUNT (empno) EN emp_count del EMPFOR i IN 1 LOOP emp_countEND LOOP

El valor de emp_count se desconoce en tiempo de compilacioacuten el SELECT instruccioacuten devuelve elvalor en tiempo de ejecucioacuten

iquestQueacute pasa si el liacutemite inferior de un rango de bucle evaluacutea a un entero mayor que el liacutemitesuperior Como muestra el siguiente ejemplo la secuencia de declaraciones dentro del bucle no sejecuta y el control pasa a la siguiente sentencia

- Liacutemite se convierte en unDE LOOP liacutemite i IN 2 sequence_of_statements - ejecuta cero vecesEND LOOP

- El control pasa aquiacute

Las reglas de aacutembito

El contador del bucle soacutelo se define dentro del bucle No se puede hacer referencia a eacutel fuera delbucle Despueacutes se sale del bucle el contador del bucle no estaacute definido como muestra el siguientejemplo

PARA CTR en 1 10 LOOPEND LOOPsuma = ctr - 1 - no se permite

Usted no necesita declarar expliacutecitamente el contador del bucle ya que se declara impliacutecitamentecomo una variable local de tipo INTEGER El siguiente ejemplo muestra que la declaracioacuten localoculta cualquier declaracioacuten global

DECLAREctr INTEGERCOMENZARPARA CTR en 1 25 LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1419

Si Ctrgt 10 THEN - Se refiere al contador del bucleEND LOOPEND

Para hacer referencia a la variable global en este ejemplo debe utilizar una etiqueta y la notacioacutenpuntos como sigue

ltltmaingtgtDECLAREctr INTEGERCOMENZARPARA CTR en 1 25 LOOPSI mainctrgt 10 THEN - se refiere a la variable globalEND IFEND LOOPEND principal

Las reglas del aacutembito mismo se aplica a anidar FOR bucles Considere el siguiente ejemplo Ambocontadores de bucles con el mismo nombre Por lo tanto para hacer referencia al contador del buexterno del bucle interno debe utilizar una etiqueta y la notacioacuten de puntos como sigue

ltltoutergtgtPara el paso en 1 25 LOOPPara el paso en 1 10 LOOPSI outerstepgt 15 ENTONCES END LOOP

END LOOP exterior

Utilizando la sentencia EXIT

La EXIT declaracioacuten permite una FOR vuelta completa antes de tiempo Por ejemplo el siguientebucle se ejecuta normalmente diez veces pero tan pronto como el FETCH declaracioacuten no devuelveuna fila el ciclo se completa no importa cuaacutentas veces se ha ejecutado

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA AL NOTFOUND c1

END LOOP

Suponga que usted debe salir de un anidados FOR bucle antes de tiempo Puede completar no soacutelolazo de corriente pero ninguacuten lazo de inclusioacuten Simplemente la etiqueta del bucle encierra quedesea completar A continuacioacuten utilice la etiqueta de una EXIT declaracioacuten para especificarqueacute FOR bucle de salida de la siguiente manera

ltltoutergtgtFOR i IN 1 5 LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1519

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA exterior cuando NOTFOUND c1 - salida tanto para los buclesEND LOOPEND LOOP exterior- El control pasa aquiacute

Secuencial de control GOTO y declaraciones NULL

A diferencia de la IF y LOOP declaraciones el GOTO y NULL declaraciones no son cruciales para PL SQL de programacioacuten La estructura de PL SQL es tal que el GOTO declaracioacuten es rara veznecesario De vez en cuando se puede simplificar la loacutegica suficiente como para justificar suuso La NULL declaracioacuten puede mejorar la legibilidad al hacer que el significado y la accioacuten de lasentencias condicionales claro

El uso excesivo de GOTO declaraciones puede generar un coacutedigo complejo no estructurada (a vecellamado spaghetti coacutedigo) que es difiacutecil de entender y mantener Por lo tanto el

uso GOTO declaraciones con moderacioacuten Por ejemplo para poder partir de una estructura anidadauna rutina de control de errores una excepcioacuten en lugar de utilizar un GOTO comunicado

GoTo

El GOTO ramas declaracioacuten a una etiqueta de manera incondicional La etiqueta debe ser uacutenico en alcance y debe preceder a una sentencia ejecutable o un bloque PL SQL Cuando se ejecutael GOTO transfiere el informe de control a la sentencia etiquetada o del bloque En el siguienteejemplo usted va a una sentencia ejecutable maacutes abajo en una secuencia de instrucciones

COMENZARGOTO insert_rowltltinsert_rowgtgtINSERT INTO VALORES emp END

En el siguiente ejemplo usted va a un bloque PL SQL maacutes arriba en una secuencia deinstrucciones

COMENZARltltupdate_rowgtgtCOMENZARACTUALIZACIOacuteN eacutenfasis JUEGO ENDGOTO update_rowEND

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1619

La etiqueta end_loop en el siguiente ejemplo no estaacute permitido porque no precede a una sentenciaejecutable

DECLAREhace booleanCOMENZARFOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgt - No se permiteEND LOOP - no es una sentencia ejecutableEND

Para depurar el uacuteltimo ejemplo soacutelo tiene que antildeadir el NULL declaracioacuten de la siguiente manera

FOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgtNULL - una sentencia ejecutableEND LOOP

Como muestra el siguiente ejemplo un GOTO declaracioacuten puede rama de un bloque que lo contiendesde el bloque actual

DECLAREmy_ename CHAR (10)COMENZARltltget_namegtgtSELECCIONAR Ename EN my_ename de EMP DONDE COMENZARObtiene_nombre GOTO - rama adjuntando bloqueENDEND

El GOTO ramas declaracioacuten al primer bloque encierra en el que la etiqueta se hace referencia apare

Restricciones

Algunos de los destinos posibles de un GOTO declaracioacuten no se permite En concretoun GOTO declaracioacuten no puede bifurcarse en un IF declaracioacuten CASE declaracioacuten LOOP declaracioacutensub-bloque Por ejemplo la siguiente GOTO declaracioacuten no se permite

COMENZARGOTO update_row - no se ramifican en IFSI ENTONCES vaacutelida

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1719

ltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

Como muestra el siguiente ejemplo un GOTO declaracioacuten no puede rama de un IF claacuteusula dedeclaracioacuten a otra Del mismo modo un GOTO declaracioacuten no puede rama deun CASE declaracioacuten WHEN claacuteusula a otra

COMENZARSI ENTONCES vaacutelidaGOTO update_row - no se ramifican en la claacuteusula ELSEELSEltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

El siguiente ejemplo muestra que un GOTO declaracioacuten no puede rama de un bloque que lo contienen un sub-bloque

COMENZARSi el estado = obsoletos THENGOTO delete_part - no se ramifican en sub-bloqueEND IFCOMENZAR

ltltdelete_partgtgtCANCELACIOacuteN de piezas en las ENDEND

Ademaacutes un GOTO declaracioacuten no puede ramificar hacia fuera de un subprograma como muestra esiguiente ejemplo

DECLARE

PROCEDIMIENTO compute_bonus (NUacuteMERO emp_id) ESCOMENZARGOTO update_row - no se puede ramificar hacia fuera del subprogramaENDCOMENZARltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1819

Por uacuteltimo un GOTO declaracioacuten no puede rama de un manejador de excepcioacuten en el bloqueactual Por ejemplo la siguiente GOTO declaracioacuten no se permite

DECLAREpe_ratio REALCOMENZARSelecciona el precio NVL (ingresos 0) en pe_ratio DE

ltltinsert_rowgtgtINSERT INTO VALORES Estadiacutesticas (pe_ratio )EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEpe_ratio = 0GOTO insert_row - no se puede poder en el bloque actualEND

Sin embargo un GOTO declaracioacuten puede rama de un manejador de excepciones en un bloque que contiene

Declaracioacuten de NULL

La NULL declaracioacuten no hace otra cosa que el control pase a la siguiente instruccioacuten En unconstructor condicional el NULL declaracioacuten dice a los lectores la posibilidad de que se haconsiderado pero no hay accioacuten que sea necesaria En el siguiente ejemplo el NULL declaracioacutendemuestra que no se toman medidas de excepcioacuten sin nombre

EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEROLLBACKCUANDO ENTONCES VALUE_ERROR

INSERT INTO VALORES errores COMMITCUANDO OTROS ENTONCESNULLEND

En IF las declaraciones u otros lugares que requieren por lo menos una sentencia ejecutableel NULL declaracioacuten para satisfacer a la sintaxis En el siguiente ejemplo el NULL declaracioacuten hacehincapieacute en que soacutelo los mejores empleados reciban bonificaciones

Si la calificacioacutengt 90 THEN

compute_bonus (emp_id)ELSENULLEND IF

Ademaacutes el NULL declaracioacuten es una forma praacutectica para crear recibos de la hora de disentildearaplicaciones de arriba hacia abajo Un taloacuten se subprograma ficticio que le permite diferir ladefinicioacuten de un procedimiento o funcioacuten hasta que probar y depurar el programa principal En elsiguiente ejemplo el NULL declaracioacuten cumple con el requisito de que al menos una declaracioacutendebe aparecer en la parte ejecutable de un subprograma

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1919

PROCEDIMIENTO debit_account (acct_id INTEGER REAL cantidad) ESCOMENZARNULLEND debit_account

Copyright copy 1996 2002 Oracle Corporation Todos los derechos reservados

Casa

Lista delibros

Contenido

Iacutendice

MasterIndex

Realiment

Page 9: programacion oracle

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 919

EXIT-AL

El EXIT-WHEN declaracioacuten permite que un circuito completo de forma condicional Cuando la EXIT

encuentra la instruccioacuten la condicioacuten en la WHEN claacuteusula se evaluacutea Si la condicioacuten es verdadera ciclo se completa y el control pasa a la siguiente sentencia despueacutes del bucle Un ejemplo es elsiguiente

LOOPFETCH C1 EN SALIDA AL NOTFOUND c1 - bucle de salida si la condicioacuten es verdaderaEND LOOPCLOSE c1

Hasta que la condicioacuten es verdadera el bucle no se puede completar Por lo tanto una declaracioacutendentro del bucle debe cambiar el valor de la condicioacuten En el uacuteltimo ejemplo si el FETCH sentencidevuelve una fila la condicioacuten es falsa Cuando el FETCH declaracioacuten no devuelve una fila lacondicioacuten es verdadera el ciclo se completa y el control pasa a la CLOSE comunicado

El EXIT-WHEN declaracioacuten sustituye a un simple IF comunicado Por ejemplo compare las siguiendeclaraciones

Si el recuentogt 100 THEN | SALIDA CUANDO cuentagt 100EXIT |END IF |

Estas declaraciones son loacutegicamente equivalentes pero el EXIT-WHEN declaracioacuten es maacutes faacutecil deleer y entender

Etiquetas de bucle

Como bloques PL SQL loops pueden ser etiquetados La etiqueta un identificador no declaradocerrado entre pareacutentesis angulares dobles debe aparecer al principio de la LOOP declaracioacuten de lasiguiente manera

ltltlabel_namegtgtLOOPsequence_of_statementsEND LOOP

Opcionalmente el nombre de la etiqueta tambieacuten puede aparecer al final de la LOOP declaracioacutencomo muestra el siguiente ejemplo

ltltmy_loopgtgtLOOPEND LOOP my_loop

Al nidos marcados ciclos el uso final los nombres de etiqueta para mejorar la legibilidad

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1019

Con cualquier forma de EXIT declaracioacuten usted puede completar no soacutelo el lazo de corriente peroninguacuten lazo de inclusioacuten Simplemente la etiqueta del bucle encierra que desea completar Acontinuacioacuten utilice la etiqueta de una EXIT declaracioacuten de la siguiente manera

ltltoutergtgtLOOPLOOP

SALIDA exterior cuando - Salida de los dos buclesEND LOOPEND LOOP exterior

Cada adjuntando bucle hasta e incluyendo el bucle etiquetado se sale

Bucle while

El WHILE-LOOP socios la declaracioacuten de un estado con una secuencia de sentencias encerradas por

palabras clave LOOP y END LOOP como sigue

MIENTRAS condicioacuten de buclesequence_of_statementsEND LOOP

Antes de cada iteracioacuten del bucle se evaluacutea la condicioacuten Si la condicioacuten es verdadera la secuencde instrucciones se ejecuta el control se reanuda en la parte superior del bucle Si la condicioacuten esfalsa o nula el bucle se pasa por alto y el control pasa a la siguiente instruccioacuten Un ejemplo es elsiguiente

Mientras que el total lt= 25000 LOOPSELECCIONAR sal en el sueldo de EMP DONDE total = salario total +END LOOP

El nuacutemero de iteraciones depende de la condicioacuten y se desconoce hasta que el bucle termina Lacondicioacuten se comprueba en la parte superior del bucle por lo que la secuencia podriacutea ejecutar porcero En el uacuteltimo ejemplo si el valor inicial del total es mayor que 25000 la condicioacuten es falsael bucle se pasa por alto

Algunos idiomas tienen una LOOP UNTIL o REPEAT UNTIL estructura lo que prueba la condicioacuten en parte inferior del bucle en lugar de en la parte superior Por lo tanto la secuencia de instruccionesque se ejecuta al menos una vez PL SQL no tiene una estructura tal pero se puede construir unode la siguiente manera

LOOPsequence_of_statementsSALIDA AL boolean_expressionEND LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1119

Para asegurarse de que una WHILE bucle se ejecuta al menos una vez utilizar una variable Booleaninicializa en el estado de la siguiente manera

hecho = falseMIENTRAS NO hacer LOOPsequence_of_statementshecho = boolean_expressionEND LOOP

Una declaracioacuten dentro del bucle debe asignar un nuevo valor a la variable booleana De locontrario usted tiene un bucle infinito Por ejemplo el siguiente LOOP declaraciones sonloacutegicamente equivalentes

Bucle WHILE TRUE | LOOP | END LOOP | END LOOP

FOR-LOOP

Mientras que el nuacutemero de iteraciones a traveacutes de un WHILE bucle no se conoce hasta el bucletermina el nuacutemero de iteraciones a traveacutes de una FOR bucle se conoce antes de que el bucle seintroduce FOR bucles iterar a traveacutes de un rango especiacutefico de nuacutemeros enteros La gama es parteun esquema de iteracioacuten que estaacute rodeada por las palabras clave FOR y LOOP Un doble punto ( es el operador de rango La sintaxis es la siguiente

PARA contador en [atraacutes] lower_bound higher_bound LOOPsequence_of_statementsEND LOOP

La gama se evaluacutea cuando la FOR bucle se entroacute por primera vez y nunca volver a evaluarse

Como muestra el siguiente ejemplo la secuencia de instrucciones se ejecuta una vez para cadaentero en el rango Despueacutes de cada iteracioacuten el contador del bucle se incrementa

FOR i IN 1 3 LOOP - asignar los valores 123 para isequence_of_statements - ejecuta tres vecesEND LOOP

El siguiente ejemplo muestra que si el liacutemite inferior es igual a la mayor liacutemite la secuencia de

instrucciones se ejecuta una vez

FOR i IN 3 3 LOOP - asignar el valor 3 para isequence_of_statements - se ejecuta una vezEND LOOP

Por los ingresos por defecto la iteracioacuten hacia arriba de la cota inferior a los consolidados maacutesaltos Sin embargo como muestra el siguiente ejemplo si utiliza la palabra clave REVERSE proceiteracioacuten hacia abajo desde el alto obligado a la cota inferior Despueacutes de cada iteracioacuten el contad

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1219

del bucle se decrementa Sin embargo se escriben los liacutemites variacutean en orden ascendente (nodescendente)

FOR i IN REVERSE 1 3 LOOP - asignar los valores de 321 isequence_of_statements - ejecuta tres vecesEND LOOP

Dentro de una FOR bucle el contador del bucle se puede hacer referencia como una constante perno se puede asignar valores como muestra el siguiente ejemplo

PARA CTR en 1 10 LOOPSI NO ENTONCES terminadoINSERT INTO VALUES (ctr ) - legalfactor = ctr 2 - legalELSEctr = 10 - no se permiteEND IFEND LOOP

Esquemas de iteracioacuten

Los liacutemites de un rango de bucle puede ser literales variables o expresiones sino que debe evalua los nuacutemeros De lo contrario PL SQL lanza la excepcioacuten predefinida VALUE_ERROR El liacutemiteinferior no tiene que ser 1 como los ejemplos a continuacioacuten muestran Sin embargo el incremendel contador del bucle (o disminuir) debe ser 1

j EN -5 5k AL REVEacuteS primero uacuteltimapaso en 0 TRUNCAR (alto bajo) 2

Internamente PL SQL asigna los valores de los liacutemites temporales a PLS_INTEGER variables y sinecesario redondea los valores al entero maacutes cercano El rango de magnitud de un PLS_INTEGER ede -2 31 2 31 Por lo tanto si un liacutemite como resultado un nuacutemero fuera del rango seobtiene un error de desbordamiento numeacuterico cuando PL SQL los intentos de la asignacioacuten commuestra el siguiente ejemplo

DECLARENUacuteMERO hi = 2 32COMENZARPara j EN 1 LOOP hi - provoca un error de un desbordamiento numeacuterico

END LOOPEND

Algunos lenguajes proporcionan STEP claacuteusula que le permite especificar un incremento diferent(5 en vez de 1 por ejemplo) PL SQL no tiene una estructura tal pero se puede construiruno Dentro de la FOR bucle simplemente se multiplica cada referencia al contador del bucle por enuevo incremento En el siguiente ejemplo se asigna la fecha de hoy a los elementos de 5 10 y 1de un iacutendice por tabla

DECLARE

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1319

DateList TIPO ES LA MESA DEL IacuteNDICE DE FECHA POR BINARY_INTEGERfechas DateListINTEGER constante k = 5 - conjunto nuevo incrementoCOMENZARPara j EN 1 3 LOOPfechas (j k) = SYSDATE - se multiplican bucle contador incrementoEND LOOPEND

Rangos dinaacutemicos

PL SQL le permite determinar el rango de bucle de forma dinaacutemica en tiempo de ejecucioacuten commuestra el siguiente ejemplo

SELECT COUNT (empno) EN emp_count del EMPFOR i IN 1 LOOP emp_countEND LOOP

El valor de emp_count se desconoce en tiempo de compilacioacuten el SELECT instruccioacuten devuelve elvalor en tiempo de ejecucioacuten

iquestQueacute pasa si el liacutemite inferior de un rango de bucle evaluacutea a un entero mayor que el liacutemitesuperior Como muestra el siguiente ejemplo la secuencia de declaraciones dentro del bucle no sejecuta y el control pasa a la siguiente sentencia

- Liacutemite se convierte en unDE LOOP liacutemite i IN 2 sequence_of_statements - ejecuta cero vecesEND LOOP

- El control pasa aquiacute

Las reglas de aacutembito

El contador del bucle soacutelo se define dentro del bucle No se puede hacer referencia a eacutel fuera delbucle Despueacutes se sale del bucle el contador del bucle no estaacute definido como muestra el siguientejemplo

PARA CTR en 1 10 LOOPEND LOOPsuma = ctr - 1 - no se permite

Usted no necesita declarar expliacutecitamente el contador del bucle ya que se declara impliacutecitamentecomo una variable local de tipo INTEGER El siguiente ejemplo muestra que la declaracioacuten localoculta cualquier declaracioacuten global

DECLAREctr INTEGERCOMENZARPARA CTR en 1 25 LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1419

Si Ctrgt 10 THEN - Se refiere al contador del bucleEND LOOPEND

Para hacer referencia a la variable global en este ejemplo debe utilizar una etiqueta y la notacioacutenpuntos como sigue

ltltmaingtgtDECLAREctr INTEGERCOMENZARPARA CTR en 1 25 LOOPSI mainctrgt 10 THEN - se refiere a la variable globalEND IFEND LOOPEND principal

Las reglas del aacutembito mismo se aplica a anidar FOR bucles Considere el siguiente ejemplo Ambocontadores de bucles con el mismo nombre Por lo tanto para hacer referencia al contador del buexterno del bucle interno debe utilizar una etiqueta y la notacioacuten de puntos como sigue

ltltoutergtgtPara el paso en 1 25 LOOPPara el paso en 1 10 LOOPSI outerstepgt 15 ENTONCES END LOOP

END LOOP exterior

Utilizando la sentencia EXIT

La EXIT declaracioacuten permite una FOR vuelta completa antes de tiempo Por ejemplo el siguientebucle se ejecuta normalmente diez veces pero tan pronto como el FETCH declaracioacuten no devuelveuna fila el ciclo se completa no importa cuaacutentas veces se ha ejecutado

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA AL NOTFOUND c1

END LOOP

Suponga que usted debe salir de un anidados FOR bucle antes de tiempo Puede completar no soacutelolazo de corriente pero ninguacuten lazo de inclusioacuten Simplemente la etiqueta del bucle encierra quedesea completar A continuacioacuten utilice la etiqueta de una EXIT declaracioacuten para especificarqueacute FOR bucle de salida de la siguiente manera

ltltoutergtgtFOR i IN 1 5 LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1519

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA exterior cuando NOTFOUND c1 - salida tanto para los buclesEND LOOPEND LOOP exterior- El control pasa aquiacute

Secuencial de control GOTO y declaraciones NULL

A diferencia de la IF y LOOP declaraciones el GOTO y NULL declaraciones no son cruciales para PL SQL de programacioacuten La estructura de PL SQL es tal que el GOTO declaracioacuten es rara veznecesario De vez en cuando se puede simplificar la loacutegica suficiente como para justificar suuso La NULL declaracioacuten puede mejorar la legibilidad al hacer que el significado y la accioacuten de lasentencias condicionales claro

El uso excesivo de GOTO declaraciones puede generar un coacutedigo complejo no estructurada (a vecellamado spaghetti coacutedigo) que es difiacutecil de entender y mantener Por lo tanto el

uso GOTO declaraciones con moderacioacuten Por ejemplo para poder partir de una estructura anidadauna rutina de control de errores una excepcioacuten en lugar de utilizar un GOTO comunicado

GoTo

El GOTO ramas declaracioacuten a una etiqueta de manera incondicional La etiqueta debe ser uacutenico en alcance y debe preceder a una sentencia ejecutable o un bloque PL SQL Cuando se ejecutael GOTO transfiere el informe de control a la sentencia etiquetada o del bloque En el siguienteejemplo usted va a una sentencia ejecutable maacutes abajo en una secuencia de instrucciones

COMENZARGOTO insert_rowltltinsert_rowgtgtINSERT INTO VALORES emp END

En el siguiente ejemplo usted va a un bloque PL SQL maacutes arriba en una secuencia deinstrucciones

COMENZARltltupdate_rowgtgtCOMENZARACTUALIZACIOacuteN eacutenfasis JUEGO ENDGOTO update_rowEND

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1619

La etiqueta end_loop en el siguiente ejemplo no estaacute permitido porque no precede a una sentenciaejecutable

DECLAREhace booleanCOMENZARFOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgt - No se permiteEND LOOP - no es una sentencia ejecutableEND

Para depurar el uacuteltimo ejemplo soacutelo tiene que antildeadir el NULL declaracioacuten de la siguiente manera

FOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgtNULL - una sentencia ejecutableEND LOOP

Como muestra el siguiente ejemplo un GOTO declaracioacuten puede rama de un bloque que lo contiendesde el bloque actual

DECLAREmy_ename CHAR (10)COMENZARltltget_namegtgtSELECCIONAR Ename EN my_ename de EMP DONDE COMENZARObtiene_nombre GOTO - rama adjuntando bloqueENDEND

El GOTO ramas declaracioacuten al primer bloque encierra en el que la etiqueta se hace referencia apare

Restricciones

Algunos de los destinos posibles de un GOTO declaracioacuten no se permite En concretoun GOTO declaracioacuten no puede bifurcarse en un IF declaracioacuten CASE declaracioacuten LOOP declaracioacutensub-bloque Por ejemplo la siguiente GOTO declaracioacuten no se permite

COMENZARGOTO update_row - no se ramifican en IFSI ENTONCES vaacutelida

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1719

ltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

Como muestra el siguiente ejemplo un GOTO declaracioacuten no puede rama de un IF claacuteusula dedeclaracioacuten a otra Del mismo modo un GOTO declaracioacuten no puede rama deun CASE declaracioacuten WHEN claacuteusula a otra

COMENZARSI ENTONCES vaacutelidaGOTO update_row - no se ramifican en la claacuteusula ELSEELSEltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

El siguiente ejemplo muestra que un GOTO declaracioacuten no puede rama de un bloque que lo contienen un sub-bloque

COMENZARSi el estado = obsoletos THENGOTO delete_part - no se ramifican en sub-bloqueEND IFCOMENZAR

ltltdelete_partgtgtCANCELACIOacuteN de piezas en las ENDEND

Ademaacutes un GOTO declaracioacuten no puede ramificar hacia fuera de un subprograma como muestra esiguiente ejemplo

DECLARE

PROCEDIMIENTO compute_bonus (NUacuteMERO emp_id) ESCOMENZARGOTO update_row - no se puede ramificar hacia fuera del subprogramaENDCOMENZARltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1819

Por uacuteltimo un GOTO declaracioacuten no puede rama de un manejador de excepcioacuten en el bloqueactual Por ejemplo la siguiente GOTO declaracioacuten no se permite

DECLAREpe_ratio REALCOMENZARSelecciona el precio NVL (ingresos 0) en pe_ratio DE

ltltinsert_rowgtgtINSERT INTO VALORES Estadiacutesticas (pe_ratio )EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEpe_ratio = 0GOTO insert_row - no se puede poder en el bloque actualEND

Sin embargo un GOTO declaracioacuten puede rama de un manejador de excepciones en un bloque que contiene

Declaracioacuten de NULL

La NULL declaracioacuten no hace otra cosa que el control pase a la siguiente instruccioacuten En unconstructor condicional el NULL declaracioacuten dice a los lectores la posibilidad de que se haconsiderado pero no hay accioacuten que sea necesaria En el siguiente ejemplo el NULL declaracioacutendemuestra que no se toman medidas de excepcioacuten sin nombre

EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEROLLBACKCUANDO ENTONCES VALUE_ERROR

INSERT INTO VALORES errores COMMITCUANDO OTROS ENTONCESNULLEND

En IF las declaraciones u otros lugares que requieren por lo menos una sentencia ejecutableel NULL declaracioacuten para satisfacer a la sintaxis En el siguiente ejemplo el NULL declaracioacuten hacehincapieacute en que soacutelo los mejores empleados reciban bonificaciones

Si la calificacioacutengt 90 THEN

compute_bonus (emp_id)ELSENULLEND IF

Ademaacutes el NULL declaracioacuten es una forma praacutectica para crear recibos de la hora de disentildearaplicaciones de arriba hacia abajo Un taloacuten se subprograma ficticio que le permite diferir ladefinicioacuten de un procedimiento o funcioacuten hasta que probar y depurar el programa principal En elsiguiente ejemplo el NULL declaracioacuten cumple con el requisito de que al menos una declaracioacutendebe aparecer en la parte ejecutable de un subprograma

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1919

PROCEDIMIENTO debit_account (acct_id INTEGER REAL cantidad) ESCOMENZARNULLEND debit_account

Copyright copy 1996 2002 Oracle Corporation Todos los derechos reservados

Casa

Lista delibros

Contenido

Iacutendice

MasterIndex

Realiment

Page 10: programacion oracle

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1019

Con cualquier forma de EXIT declaracioacuten usted puede completar no soacutelo el lazo de corriente peroninguacuten lazo de inclusioacuten Simplemente la etiqueta del bucle encierra que desea completar Acontinuacioacuten utilice la etiqueta de una EXIT declaracioacuten de la siguiente manera

ltltoutergtgtLOOPLOOP

SALIDA exterior cuando - Salida de los dos buclesEND LOOPEND LOOP exterior

Cada adjuntando bucle hasta e incluyendo el bucle etiquetado se sale

Bucle while

El WHILE-LOOP socios la declaracioacuten de un estado con una secuencia de sentencias encerradas por

palabras clave LOOP y END LOOP como sigue

MIENTRAS condicioacuten de buclesequence_of_statementsEND LOOP

Antes de cada iteracioacuten del bucle se evaluacutea la condicioacuten Si la condicioacuten es verdadera la secuencde instrucciones se ejecuta el control se reanuda en la parte superior del bucle Si la condicioacuten esfalsa o nula el bucle se pasa por alto y el control pasa a la siguiente instruccioacuten Un ejemplo es elsiguiente

Mientras que el total lt= 25000 LOOPSELECCIONAR sal en el sueldo de EMP DONDE total = salario total +END LOOP

El nuacutemero de iteraciones depende de la condicioacuten y se desconoce hasta que el bucle termina Lacondicioacuten se comprueba en la parte superior del bucle por lo que la secuencia podriacutea ejecutar porcero En el uacuteltimo ejemplo si el valor inicial del total es mayor que 25000 la condicioacuten es falsael bucle se pasa por alto

Algunos idiomas tienen una LOOP UNTIL o REPEAT UNTIL estructura lo que prueba la condicioacuten en parte inferior del bucle en lugar de en la parte superior Por lo tanto la secuencia de instruccionesque se ejecuta al menos una vez PL SQL no tiene una estructura tal pero se puede construir unode la siguiente manera

LOOPsequence_of_statementsSALIDA AL boolean_expressionEND LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1119

Para asegurarse de que una WHILE bucle se ejecuta al menos una vez utilizar una variable Booleaninicializa en el estado de la siguiente manera

hecho = falseMIENTRAS NO hacer LOOPsequence_of_statementshecho = boolean_expressionEND LOOP

Una declaracioacuten dentro del bucle debe asignar un nuevo valor a la variable booleana De locontrario usted tiene un bucle infinito Por ejemplo el siguiente LOOP declaraciones sonloacutegicamente equivalentes

Bucle WHILE TRUE | LOOP | END LOOP | END LOOP

FOR-LOOP

Mientras que el nuacutemero de iteraciones a traveacutes de un WHILE bucle no se conoce hasta el bucletermina el nuacutemero de iteraciones a traveacutes de una FOR bucle se conoce antes de que el bucle seintroduce FOR bucles iterar a traveacutes de un rango especiacutefico de nuacutemeros enteros La gama es parteun esquema de iteracioacuten que estaacute rodeada por las palabras clave FOR y LOOP Un doble punto ( es el operador de rango La sintaxis es la siguiente

PARA contador en [atraacutes] lower_bound higher_bound LOOPsequence_of_statementsEND LOOP

La gama se evaluacutea cuando la FOR bucle se entroacute por primera vez y nunca volver a evaluarse

Como muestra el siguiente ejemplo la secuencia de instrucciones se ejecuta una vez para cadaentero en el rango Despueacutes de cada iteracioacuten el contador del bucle se incrementa

FOR i IN 1 3 LOOP - asignar los valores 123 para isequence_of_statements - ejecuta tres vecesEND LOOP

El siguiente ejemplo muestra que si el liacutemite inferior es igual a la mayor liacutemite la secuencia de

instrucciones se ejecuta una vez

FOR i IN 3 3 LOOP - asignar el valor 3 para isequence_of_statements - se ejecuta una vezEND LOOP

Por los ingresos por defecto la iteracioacuten hacia arriba de la cota inferior a los consolidados maacutesaltos Sin embargo como muestra el siguiente ejemplo si utiliza la palabra clave REVERSE proceiteracioacuten hacia abajo desde el alto obligado a la cota inferior Despueacutes de cada iteracioacuten el contad

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1219

del bucle se decrementa Sin embargo se escriben los liacutemites variacutean en orden ascendente (nodescendente)

FOR i IN REVERSE 1 3 LOOP - asignar los valores de 321 isequence_of_statements - ejecuta tres vecesEND LOOP

Dentro de una FOR bucle el contador del bucle se puede hacer referencia como una constante perno se puede asignar valores como muestra el siguiente ejemplo

PARA CTR en 1 10 LOOPSI NO ENTONCES terminadoINSERT INTO VALUES (ctr ) - legalfactor = ctr 2 - legalELSEctr = 10 - no se permiteEND IFEND LOOP

Esquemas de iteracioacuten

Los liacutemites de un rango de bucle puede ser literales variables o expresiones sino que debe evalua los nuacutemeros De lo contrario PL SQL lanza la excepcioacuten predefinida VALUE_ERROR El liacutemiteinferior no tiene que ser 1 como los ejemplos a continuacioacuten muestran Sin embargo el incremendel contador del bucle (o disminuir) debe ser 1

j EN -5 5k AL REVEacuteS primero uacuteltimapaso en 0 TRUNCAR (alto bajo) 2

Internamente PL SQL asigna los valores de los liacutemites temporales a PLS_INTEGER variables y sinecesario redondea los valores al entero maacutes cercano El rango de magnitud de un PLS_INTEGER ede -2 31 2 31 Por lo tanto si un liacutemite como resultado un nuacutemero fuera del rango seobtiene un error de desbordamiento numeacuterico cuando PL SQL los intentos de la asignacioacuten commuestra el siguiente ejemplo

DECLARENUacuteMERO hi = 2 32COMENZARPara j EN 1 LOOP hi - provoca un error de un desbordamiento numeacuterico

END LOOPEND

Algunos lenguajes proporcionan STEP claacuteusula que le permite especificar un incremento diferent(5 en vez de 1 por ejemplo) PL SQL no tiene una estructura tal pero se puede construiruno Dentro de la FOR bucle simplemente se multiplica cada referencia al contador del bucle por enuevo incremento En el siguiente ejemplo se asigna la fecha de hoy a los elementos de 5 10 y 1de un iacutendice por tabla

DECLARE

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1319

DateList TIPO ES LA MESA DEL IacuteNDICE DE FECHA POR BINARY_INTEGERfechas DateListINTEGER constante k = 5 - conjunto nuevo incrementoCOMENZARPara j EN 1 3 LOOPfechas (j k) = SYSDATE - se multiplican bucle contador incrementoEND LOOPEND

Rangos dinaacutemicos

PL SQL le permite determinar el rango de bucle de forma dinaacutemica en tiempo de ejecucioacuten commuestra el siguiente ejemplo

SELECT COUNT (empno) EN emp_count del EMPFOR i IN 1 LOOP emp_countEND LOOP

El valor de emp_count se desconoce en tiempo de compilacioacuten el SELECT instruccioacuten devuelve elvalor en tiempo de ejecucioacuten

iquestQueacute pasa si el liacutemite inferior de un rango de bucle evaluacutea a un entero mayor que el liacutemitesuperior Como muestra el siguiente ejemplo la secuencia de declaraciones dentro del bucle no sejecuta y el control pasa a la siguiente sentencia

- Liacutemite se convierte en unDE LOOP liacutemite i IN 2 sequence_of_statements - ejecuta cero vecesEND LOOP

- El control pasa aquiacute

Las reglas de aacutembito

El contador del bucle soacutelo se define dentro del bucle No se puede hacer referencia a eacutel fuera delbucle Despueacutes se sale del bucle el contador del bucle no estaacute definido como muestra el siguientejemplo

PARA CTR en 1 10 LOOPEND LOOPsuma = ctr - 1 - no se permite

Usted no necesita declarar expliacutecitamente el contador del bucle ya que se declara impliacutecitamentecomo una variable local de tipo INTEGER El siguiente ejemplo muestra que la declaracioacuten localoculta cualquier declaracioacuten global

DECLAREctr INTEGERCOMENZARPARA CTR en 1 25 LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1419

Si Ctrgt 10 THEN - Se refiere al contador del bucleEND LOOPEND

Para hacer referencia a la variable global en este ejemplo debe utilizar una etiqueta y la notacioacutenpuntos como sigue

ltltmaingtgtDECLAREctr INTEGERCOMENZARPARA CTR en 1 25 LOOPSI mainctrgt 10 THEN - se refiere a la variable globalEND IFEND LOOPEND principal

Las reglas del aacutembito mismo se aplica a anidar FOR bucles Considere el siguiente ejemplo Ambocontadores de bucles con el mismo nombre Por lo tanto para hacer referencia al contador del buexterno del bucle interno debe utilizar una etiqueta y la notacioacuten de puntos como sigue

ltltoutergtgtPara el paso en 1 25 LOOPPara el paso en 1 10 LOOPSI outerstepgt 15 ENTONCES END LOOP

END LOOP exterior

Utilizando la sentencia EXIT

La EXIT declaracioacuten permite una FOR vuelta completa antes de tiempo Por ejemplo el siguientebucle se ejecuta normalmente diez veces pero tan pronto como el FETCH declaracioacuten no devuelveuna fila el ciclo se completa no importa cuaacutentas veces se ha ejecutado

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA AL NOTFOUND c1

END LOOP

Suponga que usted debe salir de un anidados FOR bucle antes de tiempo Puede completar no soacutelolazo de corriente pero ninguacuten lazo de inclusioacuten Simplemente la etiqueta del bucle encierra quedesea completar A continuacioacuten utilice la etiqueta de una EXIT declaracioacuten para especificarqueacute FOR bucle de salida de la siguiente manera

ltltoutergtgtFOR i IN 1 5 LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1519

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA exterior cuando NOTFOUND c1 - salida tanto para los buclesEND LOOPEND LOOP exterior- El control pasa aquiacute

Secuencial de control GOTO y declaraciones NULL

A diferencia de la IF y LOOP declaraciones el GOTO y NULL declaraciones no son cruciales para PL SQL de programacioacuten La estructura de PL SQL es tal que el GOTO declaracioacuten es rara veznecesario De vez en cuando se puede simplificar la loacutegica suficiente como para justificar suuso La NULL declaracioacuten puede mejorar la legibilidad al hacer que el significado y la accioacuten de lasentencias condicionales claro

El uso excesivo de GOTO declaraciones puede generar un coacutedigo complejo no estructurada (a vecellamado spaghetti coacutedigo) que es difiacutecil de entender y mantener Por lo tanto el

uso GOTO declaraciones con moderacioacuten Por ejemplo para poder partir de una estructura anidadauna rutina de control de errores una excepcioacuten en lugar de utilizar un GOTO comunicado

GoTo

El GOTO ramas declaracioacuten a una etiqueta de manera incondicional La etiqueta debe ser uacutenico en alcance y debe preceder a una sentencia ejecutable o un bloque PL SQL Cuando se ejecutael GOTO transfiere el informe de control a la sentencia etiquetada o del bloque En el siguienteejemplo usted va a una sentencia ejecutable maacutes abajo en una secuencia de instrucciones

COMENZARGOTO insert_rowltltinsert_rowgtgtINSERT INTO VALORES emp END

En el siguiente ejemplo usted va a un bloque PL SQL maacutes arriba en una secuencia deinstrucciones

COMENZARltltupdate_rowgtgtCOMENZARACTUALIZACIOacuteN eacutenfasis JUEGO ENDGOTO update_rowEND

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1619

La etiqueta end_loop en el siguiente ejemplo no estaacute permitido porque no precede a una sentenciaejecutable

DECLAREhace booleanCOMENZARFOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgt - No se permiteEND LOOP - no es una sentencia ejecutableEND

Para depurar el uacuteltimo ejemplo soacutelo tiene que antildeadir el NULL declaracioacuten de la siguiente manera

FOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgtNULL - una sentencia ejecutableEND LOOP

Como muestra el siguiente ejemplo un GOTO declaracioacuten puede rama de un bloque que lo contiendesde el bloque actual

DECLAREmy_ename CHAR (10)COMENZARltltget_namegtgtSELECCIONAR Ename EN my_ename de EMP DONDE COMENZARObtiene_nombre GOTO - rama adjuntando bloqueENDEND

El GOTO ramas declaracioacuten al primer bloque encierra en el que la etiqueta se hace referencia apare

Restricciones

Algunos de los destinos posibles de un GOTO declaracioacuten no se permite En concretoun GOTO declaracioacuten no puede bifurcarse en un IF declaracioacuten CASE declaracioacuten LOOP declaracioacutensub-bloque Por ejemplo la siguiente GOTO declaracioacuten no se permite

COMENZARGOTO update_row - no se ramifican en IFSI ENTONCES vaacutelida

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1719

ltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

Como muestra el siguiente ejemplo un GOTO declaracioacuten no puede rama de un IF claacuteusula dedeclaracioacuten a otra Del mismo modo un GOTO declaracioacuten no puede rama deun CASE declaracioacuten WHEN claacuteusula a otra

COMENZARSI ENTONCES vaacutelidaGOTO update_row - no se ramifican en la claacuteusula ELSEELSEltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

El siguiente ejemplo muestra que un GOTO declaracioacuten no puede rama de un bloque que lo contienen un sub-bloque

COMENZARSi el estado = obsoletos THENGOTO delete_part - no se ramifican en sub-bloqueEND IFCOMENZAR

ltltdelete_partgtgtCANCELACIOacuteN de piezas en las ENDEND

Ademaacutes un GOTO declaracioacuten no puede ramificar hacia fuera de un subprograma como muestra esiguiente ejemplo

DECLARE

PROCEDIMIENTO compute_bonus (NUacuteMERO emp_id) ESCOMENZARGOTO update_row - no se puede ramificar hacia fuera del subprogramaENDCOMENZARltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1819

Por uacuteltimo un GOTO declaracioacuten no puede rama de un manejador de excepcioacuten en el bloqueactual Por ejemplo la siguiente GOTO declaracioacuten no se permite

DECLAREpe_ratio REALCOMENZARSelecciona el precio NVL (ingresos 0) en pe_ratio DE

ltltinsert_rowgtgtINSERT INTO VALORES Estadiacutesticas (pe_ratio )EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEpe_ratio = 0GOTO insert_row - no se puede poder en el bloque actualEND

Sin embargo un GOTO declaracioacuten puede rama de un manejador de excepciones en un bloque que contiene

Declaracioacuten de NULL

La NULL declaracioacuten no hace otra cosa que el control pase a la siguiente instruccioacuten En unconstructor condicional el NULL declaracioacuten dice a los lectores la posibilidad de que se haconsiderado pero no hay accioacuten que sea necesaria En el siguiente ejemplo el NULL declaracioacutendemuestra que no se toman medidas de excepcioacuten sin nombre

EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEROLLBACKCUANDO ENTONCES VALUE_ERROR

INSERT INTO VALORES errores COMMITCUANDO OTROS ENTONCESNULLEND

En IF las declaraciones u otros lugares que requieren por lo menos una sentencia ejecutableel NULL declaracioacuten para satisfacer a la sintaxis En el siguiente ejemplo el NULL declaracioacuten hacehincapieacute en que soacutelo los mejores empleados reciban bonificaciones

Si la calificacioacutengt 90 THEN

compute_bonus (emp_id)ELSENULLEND IF

Ademaacutes el NULL declaracioacuten es una forma praacutectica para crear recibos de la hora de disentildearaplicaciones de arriba hacia abajo Un taloacuten se subprograma ficticio que le permite diferir ladefinicioacuten de un procedimiento o funcioacuten hasta que probar y depurar el programa principal En elsiguiente ejemplo el NULL declaracioacuten cumple con el requisito de que al menos una declaracioacutendebe aparecer en la parte ejecutable de un subprograma

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1919

PROCEDIMIENTO debit_account (acct_id INTEGER REAL cantidad) ESCOMENZARNULLEND debit_account

Copyright copy 1996 2002 Oracle Corporation Todos los derechos reservados

Casa

Lista delibros

Contenido

Iacutendice

MasterIndex

Realiment

Page 11: programacion oracle

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1119

Para asegurarse de que una WHILE bucle se ejecuta al menos una vez utilizar una variable Booleaninicializa en el estado de la siguiente manera

hecho = falseMIENTRAS NO hacer LOOPsequence_of_statementshecho = boolean_expressionEND LOOP

Una declaracioacuten dentro del bucle debe asignar un nuevo valor a la variable booleana De locontrario usted tiene un bucle infinito Por ejemplo el siguiente LOOP declaraciones sonloacutegicamente equivalentes

Bucle WHILE TRUE | LOOP | END LOOP | END LOOP

FOR-LOOP

Mientras que el nuacutemero de iteraciones a traveacutes de un WHILE bucle no se conoce hasta el bucletermina el nuacutemero de iteraciones a traveacutes de una FOR bucle se conoce antes de que el bucle seintroduce FOR bucles iterar a traveacutes de un rango especiacutefico de nuacutemeros enteros La gama es parteun esquema de iteracioacuten que estaacute rodeada por las palabras clave FOR y LOOP Un doble punto ( es el operador de rango La sintaxis es la siguiente

PARA contador en [atraacutes] lower_bound higher_bound LOOPsequence_of_statementsEND LOOP

La gama se evaluacutea cuando la FOR bucle se entroacute por primera vez y nunca volver a evaluarse

Como muestra el siguiente ejemplo la secuencia de instrucciones se ejecuta una vez para cadaentero en el rango Despueacutes de cada iteracioacuten el contador del bucle se incrementa

FOR i IN 1 3 LOOP - asignar los valores 123 para isequence_of_statements - ejecuta tres vecesEND LOOP

El siguiente ejemplo muestra que si el liacutemite inferior es igual a la mayor liacutemite la secuencia de

instrucciones se ejecuta una vez

FOR i IN 3 3 LOOP - asignar el valor 3 para isequence_of_statements - se ejecuta una vezEND LOOP

Por los ingresos por defecto la iteracioacuten hacia arriba de la cota inferior a los consolidados maacutesaltos Sin embargo como muestra el siguiente ejemplo si utiliza la palabra clave REVERSE proceiteracioacuten hacia abajo desde el alto obligado a la cota inferior Despueacutes de cada iteracioacuten el contad

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1219

del bucle se decrementa Sin embargo se escriben los liacutemites variacutean en orden ascendente (nodescendente)

FOR i IN REVERSE 1 3 LOOP - asignar los valores de 321 isequence_of_statements - ejecuta tres vecesEND LOOP

Dentro de una FOR bucle el contador del bucle se puede hacer referencia como una constante perno se puede asignar valores como muestra el siguiente ejemplo

PARA CTR en 1 10 LOOPSI NO ENTONCES terminadoINSERT INTO VALUES (ctr ) - legalfactor = ctr 2 - legalELSEctr = 10 - no se permiteEND IFEND LOOP

Esquemas de iteracioacuten

Los liacutemites de un rango de bucle puede ser literales variables o expresiones sino que debe evalua los nuacutemeros De lo contrario PL SQL lanza la excepcioacuten predefinida VALUE_ERROR El liacutemiteinferior no tiene que ser 1 como los ejemplos a continuacioacuten muestran Sin embargo el incremendel contador del bucle (o disminuir) debe ser 1

j EN -5 5k AL REVEacuteS primero uacuteltimapaso en 0 TRUNCAR (alto bajo) 2

Internamente PL SQL asigna los valores de los liacutemites temporales a PLS_INTEGER variables y sinecesario redondea los valores al entero maacutes cercano El rango de magnitud de un PLS_INTEGER ede -2 31 2 31 Por lo tanto si un liacutemite como resultado un nuacutemero fuera del rango seobtiene un error de desbordamiento numeacuterico cuando PL SQL los intentos de la asignacioacuten commuestra el siguiente ejemplo

DECLARENUacuteMERO hi = 2 32COMENZARPara j EN 1 LOOP hi - provoca un error de un desbordamiento numeacuterico

END LOOPEND

Algunos lenguajes proporcionan STEP claacuteusula que le permite especificar un incremento diferent(5 en vez de 1 por ejemplo) PL SQL no tiene una estructura tal pero se puede construiruno Dentro de la FOR bucle simplemente se multiplica cada referencia al contador del bucle por enuevo incremento En el siguiente ejemplo se asigna la fecha de hoy a los elementos de 5 10 y 1de un iacutendice por tabla

DECLARE

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1319

DateList TIPO ES LA MESA DEL IacuteNDICE DE FECHA POR BINARY_INTEGERfechas DateListINTEGER constante k = 5 - conjunto nuevo incrementoCOMENZARPara j EN 1 3 LOOPfechas (j k) = SYSDATE - se multiplican bucle contador incrementoEND LOOPEND

Rangos dinaacutemicos

PL SQL le permite determinar el rango de bucle de forma dinaacutemica en tiempo de ejecucioacuten commuestra el siguiente ejemplo

SELECT COUNT (empno) EN emp_count del EMPFOR i IN 1 LOOP emp_countEND LOOP

El valor de emp_count se desconoce en tiempo de compilacioacuten el SELECT instruccioacuten devuelve elvalor en tiempo de ejecucioacuten

iquestQueacute pasa si el liacutemite inferior de un rango de bucle evaluacutea a un entero mayor que el liacutemitesuperior Como muestra el siguiente ejemplo la secuencia de declaraciones dentro del bucle no sejecuta y el control pasa a la siguiente sentencia

- Liacutemite se convierte en unDE LOOP liacutemite i IN 2 sequence_of_statements - ejecuta cero vecesEND LOOP

- El control pasa aquiacute

Las reglas de aacutembito

El contador del bucle soacutelo se define dentro del bucle No se puede hacer referencia a eacutel fuera delbucle Despueacutes se sale del bucle el contador del bucle no estaacute definido como muestra el siguientejemplo

PARA CTR en 1 10 LOOPEND LOOPsuma = ctr - 1 - no se permite

Usted no necesita declarar expliacutecitamente el contador del bucle ya que se declara impliacutecitamentecomo una variable local de tipo INTEGER El siguiente ejemplo muestra que la declaracioacuten localoculta cualquier declaracioacuten global

DECLAREctr INTEGERCOMENZARPARA CTR en 1 25 LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1419

Si Ctrgt 10 THEN - Se refiere al contador del bucleEND LOOPEND

Para hacer referencia a la variable global en este ejemplo debe utilizar una etiqueta y la notacioacutenpuntos como sigue

ltltmaingtgtDECLAREctr INTEGERCOMENZARPARA CTR en 1 25 LOOPSI mainctrgt 10 THEN - se refiere a la variable globalEND IFEND LOOPEND principal

Las reglas del aacutembito mismo se aplica a anidar FOR bucles Considere el siguiente ejemplo Ambocontadores de bucles con el mismo nombre Por lo tanto para hacer referencia al contador del buexterno del bucle interno debe utilizar una etiqueta y la notacioacuten de puntos como sigue

ltltoutergtgtPara el paso en 1 25 LOOPPara el paso en 1 10 LOOPSI outerstepgt 15 ENTONCES END LOOP

END LOOP exterior

Utilizando la sentencia EXIT

La EXIT declaracioacuten permite una FOR vuelta completa antes de tiempo Por ejemplo el siguientebucle se ejecuta normalmente diez veces pero tan pronto como el FETCH declaracioacuten no devuelveuna fila el ciclo se completa no importa cuaacutentas veces se ha ejecutado

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA AL NOTFOUND c1

END LOOP

Suponga que usted debe salir de un anidados FOR bucle antes de tiempo Puede completar no soacutelolazo de corriente pero ninguacuten lazo de inclusioacuten Simplemente la etiqueta del bucle encierra quedesea completar A continuacioacuten utilice la etiqueta de una EXIT declaracioacuten para especificarqueacute FOR bucle de salida de la siguiente manera

ltltoutergtgtFOR i IN 1 5 LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1519

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA exterior cuando NOTFOUND c1 - salida tanto para los buclesEND LOOPEND LOOP exterior- El control pasa aquiacute

Secuencial de control GOTO y declaraciones NULL

A diferencia de la IF y LOOP declaraciones el GOTO y NULL declaraciones no son cruciales para PL SQL de programacioacuten La estructura de PL SQL es tal que el GOTO declaracioacuten es rara veznecesario De vez en cuando se puede simplificar la loacutegica suficiente como para justificar suuso La NULL declaracioacuten puede mejorar la legibilidad al hacer que el significado y la accioacuten de lasentencias condicionales claro

El uso excesivo de GOTO declaraciones puede generar un coacutedigo complejo no estructurada (a vecellamado spaghetti coacutedigo) que es difiacutecil de entender y mantener Por lo tanto el

uso GOTO declaraciones con moderacioacuten Por ejemplo para poder partir de una estructura anidadauna rutina de control de errores una excepcioacuten en lugar de utilizar un GOTO comunicado

GoTo

El GOTO ramas declaracioacuten a una etiqueta de manera incondicional La etiqueta debe ser uacutenico en alcance y debe preceder a una sentencia ejecutable o un bloque PL SQL Cuando se ejecutael GOTO transfiere el informe de control a la sentencia etiquetada o del bloque En el siguienteejemplo usted va a una sentencia ejecutable maacutes abajo en una secuencia de instrucciones

COMENZARGOTO insert_rowltltinsert_rowgtgtINSERT INTO VALORES emp END

En el siguiente ejemplo usted va a un bloque PL SQL maacutes arriba en una secuencia deinstrucciones

COMENZARltltupdate_rowgtgtCOMENZARACTUALIZACIOacuteN eacutenfasis JUEGO ENDGOTO update_rowEND

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1619

La etiqueta end_loop en el siguiente ejemplo no estaacute permitido porque no precede a una sentenciaejecutable

DECLAREhace booleanCOMENZARFOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgt - No se permiteEND LOOP - no es una sentencia ejecutableEND

Para depurar el uacuteltimo ejemplo soacutelo tiene que antildeadir el NULL declaracioacuten de la siguiente manera

FOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgtNULL - una sentencia ejecutableEND LOOP

Como muestra el siguiente ejemplo un GOTO declaracioacuten puede rama de un bloque que lo contiendesde el bloque actual

DECLAREmy_ename CHAR (10)COMENZARltltget_namegtgtSELECCIONAR Ename EN my_ename de EMP DONDE COMENZARObtiene_nombre GOTO - rama adjuntando bloqueENDEND

El GOTO ramas declaracioacuten al primer bloque encierra en el que la etiqueta se hace referencia apare

Restricciones

Algunos de los destinos posibles de un GOTO declaracioacuten no se permite En concretoun GOTO declaracioacuten no puede bifurcarse en un IF declaracioacuten CASE declaracioacuten LOOP declaracioacutensub-bloque Por ejemplo la siguiente GOTO declaracioacuten no se permite

COMENZARGOTO update_row - no se ramifican en IFSI ENTONCES vaacutelida

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1719

ltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

Como muestra el siguiente ejemplo un GOTO declaracioacuten no puede rama de un IF claacuteusula dedeclaracioacuten a otra Del mismo modo un GOTO declaracioacuten no puede rama deun CASE declaracioacuten WHEN claacuteusula a otra

COMENZARSI ENTONCES vaacutelidaGOTO update_row - no se ramifican en la claacuteusula ELSEELSEltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

El siguiente ejemplo muestra que un GOTO declaracioacuten no puede rama de un bloque que lo contienen un sub-bloque

COMENZARSi el estado = obsoletos THENGOTO delete_part - no se ramifican en sub-bloqueEND IFCOMENZAR

ltltdelete_partgtgtCANCELACIOacuteN de piezas en las ENDEND

Ademaacutes un GOTO declaracioacuten no puede ramificar hacia fuera de un subprograma como muestra esiguiente ejemplo

DECLARE

PROCEDIMIENTO compute_bonus (NUacuteMERO emp_id) ESCOMENZARGOTO update_row - no se puede ramificar hacia fuera del subprogramaENDCOMENZARltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1819

Por uacuteltimo un GOTO declaracioacuten no puede rama de un manejador de excepcioacuten en el bloqueactual Por ejemplo la siguiente GOTO declaracioacuten no se permite

DECLAREpe_ratio REALCOMENZARSelecciona el precio NVL (ingresos 0) en pe_ratio DE

ltltinsert_rowgtgtINSERT INTO VALORES Estadiacutesticas (pe_ratio )EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEpe_ratio = 0GOTO insert_row - no se puede poder en el bloque actualEND

Sin embargo un GOTO declaracioacuten puede rama de un manejador de excepciones en un bloque que contiene

Declaracioacuten de NULL

La NULL declaracioacuten no hace otra cosa que el control pase a la siguiente instruccioacuten En unconstructor condicional el NULL declaracioacuten dice a los lectores la posibilidad de que se haconsiderado pero no hay accioacuten que sea necesaria En el siguiente ejemplo el NULL declaracioacutendemuestra que no se toman medidas de excepcioacuten sin nombre

EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEROLLBACKCUANDO ENTONCES VALUE_ERROR

INSERT INTO VALORES errores COMMITCUANDO OTROS ENTONCESNULLEND

En IF las declaraciones u otros lugares que requieren por lo menos una sentencia ejecutableel NULL declaracioacuten para satisfacer a la sintaxis En el siguiente ejemplo el NULL declaracioacuten hacehincapieacute en que soacutelo los mejores empleados reciban bonificaciones

Si la calificacioacutengt 90 THEN

compute_bonus (emp_id)ELSENULLEND IF

Ademaacutes el NULL declaracioacuten es una forma praacutectica para crear recibos de la hora de disentildearaplicaciones de arriba hacia abajo Un taloacuten se subprograma ficticio que le permite diferir ladefinicioacuten de un procedimiento o funcioacuten hasta que probar y depurar el programa principal En elsiguiente ejemplo el NULL declaracioacuten cumple con el requisito de que al menos una declaracioacutendebe aparecer en la parte ejecutable de un subprograma

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1919

PROCEDIMIENTO debit_account (acct_id INTEGER REAL cantidad) ESCOMENZARNULLEND debit_account

Copyright copy 1996 2002 Oracle Corporation Todos los derechos reservados

Casa

Lista delibros

Contenido

Iacutendice

MasterIndex

Realiment

Page 12: programacion oracle

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1219

del bucle se decrementa Sin embargo se escriben los liacutemites variacutean en orden ascendente (nodescendente)

FOR i IN REVERSE 1 3 LOOP - asignar los valores de 321 isequence_of_statements - ejecuta tres vecesEND LOOP

Dentro de una FOR bucle el contador del bucle se puede hacer referencia como una constante perno se puede asignar valores como muestra el siguiente ejemplo

PARA CTR en 1 10 LOOPSI NO ENTONCES terminadoINSERT INTO VALUES (ctr ) - legalfactor = ctr 2 - legalELSEctr = 10 - no se permiteEND IFEND LOOP

Esquemas de iteracioacuten

Los liacutemites de un rango de bucle puede ser literales variables o expresiones sino que debe evalua los nuacutemeros De lo contrario PL SQL lanza la excepcioacuten predefinida VALUE_ERROR El liacutemiteinferior no tiene que ser 1 como los ejemplos a continuacioacuten muestran Sin embargo el incremendel contador del bucle (o disminuir) debe ser 1

j EN -5 5k AL REVEacuteS primero uacuteltimapaso en 0 TRUNCAR (alto bajo) 2

Internamente PL SQL asigna los valores de los liacutemites temporales a PLS_INTEGER variables y sinecesario redondea los valores al entero maacutes cercano El rango de magnitud de un PLS_INTEGER ede -2 31 2 31 Por lo tanto si un liacutemite como resultado un nuacutemero fuera del rango seobtiene un error de desbordamiento numeacuterico cuando PL SQL los intentos de la asignacioacuten commuestra el siguiente ejemplo

DECLARENUacuteMERO hi = 2 32COMENZARPara j EN 1 LOOP hi - provoca un error de un desbordamiento numeacuterico

END LOOPEND

Algunos lenguajes proporcionan STEP claacuteusula que le permite especificar un incremento diferent(5 en vez de 1 por ejemplo) PL SQL no tiene una estructura tal pero se puede construiruno Dentro de la FOR bucle simplemente se multiplica cada referencia al contador del bucle por enuevo incremento En el siguiente ejemplo se asigna la fecha de hoy a los elementos de 5 10 y 1de un iacutendice por tabla

DECLARE

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1319

DateList TIPO ES LA MESA DEL IacuteNDICE DE FECHA POR BINARY_INTEGERfechas DateListINTEGER constante k = 5 - conjunto nuevo incrementoCOMENZARPara j EN 1 3 LOOPfechas (j k) = SYSDATE - se multiplican bucle contador incrementoEND LOOPEND

Rangos dinaacutemicos

PL SQL le permite determinar el rango de bucle de forma dinaacutemica en tiempo de ejecucioacuten commuestra el siguiente ejemplo

SELECT COUNT (empno) EN emp_count del EMPFOR i IN 1 LOOP emp_countEND LOOP

El valor de emp_count se desconoce en tiempo de compilacioacuten el SELECT instruccioacuten devuelve elvalor en tiempo de ejecucioacuten

iquestQueacute pasa si el liacutemite inferior de un rango de bucle evaluacutea a un entero mayor que el liacutemitesuperior Como muestra el siguiente ejemplo la secuencia de declaraciones dentro del bucle no sejecuta y el control pasa a la siguiente sentencia

- Liacutemite se convierte en unDE LOOP liacutemite i IN 2 sequence_of_statements - ejecuta cero vecesEND LOOP

- El control pasa aquiacute

Las reglas de aacutembito

El contador del bucle soacutelo se define dentro del bucle No se puede hacer referencia a eacutel fuera delbucle Despueacutes se sale del bucle el contador del bucle no estaacute definido como muestra el siguientejemplo

PARA CTR en 1 10 LOOPEND LOOPsuma = ctr - 1 - no se permite

Usted no necesita declarar expliacutecitamente el contador del bucle ya que se declara impliacutecitamentecomo una variable local de tipo INTEGER El siguiente ejemplo muestra que la declaracioacuten localoculta cualquier declaracioacuten global

DECLAREctr INTEGERCOMENZARPARA CTR en 1 25 LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1419

Si Ctrgt 10 THEN - Se refiere al contador del bucleEND LOOPEND

Para hacer referencia a la variable global en este ejemplo debe utilizar una etiqueta y la notacioacutenpuntos como sigue

ltltmaingtgtDECLAREctr INTEGERCOMENZARPARA CTR en 1 25 LOOPSI mainctrgt 10 THEN - se refiere a la variable globalEND IFEND LOOPEND principal

Las reglas del aacutembito mismo se aplica a anidar FOR bucles Considere el siguiente ejemplo Ambocontadores de bucles con el mismo nombre Por lo tanto para hacer referencia al contador del buexterno del bucle interno debe utilizar una etiqueta y la notacioacuten de puntos como sigue

ltltoutergtgtPara el paso en 1 25 LOOPPara el paso en 1 10 LOOPSI outerstepgt 15 ENTONCES END LOOP

END LOOP exterior

Utilizando la sentencia EXIT

La EXIT declaracioacuten permite una FOR vuelta completa antes de tiempo Por ejemplo el siguientebucle se ejecuta normalmente diez veces pero tan pronto como el FETCH declaracioacuten no devuelveuna fila el ciclo se completa no importa cuaacutentas veces se ha ejecutado

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA AL NOTFOUND c1

END LOOP

Suponga que usted debe salir de un anidados FOR bucle antes de tiempo Puede completar no soacutelolazo de corriente pero ninguacuten lazo de inclusioacuten Simplemente la etiqueta del bucle encierra quedesea completar A continuacioacuten utilice la etiqueta de una EXIT declaracioacuten para especificarqueacute FOR bucle de salida de la siguiente manera

ltltoutergtgtFOR i IN 1 5 LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1519

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA exterior cuando NOTFOUND c1 - salida tanto para los buclesEND LOOPEND LOOP exterior- El control pasa aquiacute

Secuencial de control GOTO y declaraciones NULL

A diferencia de la IF y LOOP declaraciones el GOTO y NULL declaraciones no son cruciales para PL SQL de programacioacuten La estructura de PL SQL es tal que el GOTO declaracioacuten es rara veznecesario De vez en cuando se puede simplificar la loacutegica suficiente como para justificar suuso La NULL declaracioacuten puede mejorar la legibilidad al hacer que el significado y la accioacuten de lasentencias condicionales claro

El uso excesivo de GOTO declaraciones puede generar un coacutedigo complejo no estructurada (a vecellamado spaghetti coacutedigo) que es difiacutecil de entender y mantener Por lo tanto el

uso GOTO declaraciones con moderacioacuten Por ejemplo para poder partir de una estructura anidadauna rutina de control de errores una excepcioacuten en lugar de utilizar un GOTO comunicado

GoTo

El GOTO ramas declaracioacuten a una etiqueta de manera incondicional La etiqueta debe ser uacutenico en alcance y debe preceder a una sentencia ejecutable o un bloque PL SQL Cuando se ejecutael GOTO transfiere el informe de control a la sentencia etiquetada o del bloque En el siguienteejemplo usted va a una sentencia ejecutable maacutes abajo en una secuencia de instrucciones

COMENZARGOTO insert_rowltltinsert_rowgtgtINSERT INTO VALORES emp END

En el siguiente ejemplo usted va a un bloque PL SQL maacutes arriba en una secuencia deinstrucciones

COMENZARltltupdate_rowgtgtCOMENZARACTUALIZACIOacuteN eacutenfasis JUEGO ENDGOTO update_rowEND

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1619

La etiqueta end_loop en el siguiente ejemplo no estaacute permitido porque no precede a una sentenciaejecutable

DECLAREhace booleanCOMENZARFOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgt - No se permiteEND LOOP - no es una sentencia ejecutableEND

Para depurar el uacuteltimo ejemplo soacutelo tiene que antildeadir el NULL declaracioacuten de la siguiente manera

FOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgtNULL - una sentencia ejecutableEND LOOP

Como muestra el siguiente ejemplo un GOTO declaracioacuten puede rama de un bloque que lo contiendesde el bloque actual

DECLAREmy_ename CHAR (10)COMENZARltltget_namegtgtSELECCIONAR Ename EN my_ename de EMP DONDE COMENZARObtiene_nombre GOTO - rama adjuntando bloqueENDEND

El GOTO ramas declaracioacuten al primer bloque encierra en el que la etiqueta se hace referencia apare

Restricciones

Algunos de los destinos posibles de un GOTO declaracioacuten no se permite En concretoun GOTO declaracioacuten no puede bifurcarse en un IF declaracioacuten CASE declaracioacuten LOOP declaracioacutensub-bloque Por ejemplo la siguiente GOTO declaracioacuten no se permite

COMENZARGOTO update_row - no se ramifican en IFSI ENTONCES vaacutelida

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1719

ltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

Como muestra el siguiente ejemplo un GOTO declaracioacuten no puede rama de un IF claacuteusula dedeclaracioacuten a otra Del mismo modo un GOTO declaracioacuten no puede rama deun CASE declaracioacuten WHEN claacuteusula a otra

COMENZARSI ENTONCES vaacutelidaGOTO update_row - no se ramifican en la claacuteusula ELSEELSEltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

El siguiente ejemplo muestra que un GOTO declaracioacuten no puede rama de un bloque que lo contienen un sub-bloque

COMENZARSi el estado = obsoletos THENGOTO delete_part - no se ramifican en sub-bloqueEND IFCOMENZAR

ltltdelete_partgtgtCANCELACIOacuteN de piezas en las ENDEND

Ademaacutes un GOTO declaracioacuten no puede ramificar hacia fuera de un subprograma como muestra esiguiente ejemplo

DECLARE

PROCEDIMIENTO compute_bonus (NUacuteMERO emp_id) ESCOMENZARGOTO update_row - no se puede ramificar hacia fuera del subprogramaENDCOMENZARltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1819

Por uacuteltimo un GOTO declaracioacuten no puede rama de un manejador de excepcioacuten en el bloqueactual Por ejemplo la siguiente GOTO declaracioacuten no se permite

DECLAREpe_ratio REALCOMENZARSelecciona el precio NVL (ingresos 0) en pe_ratio DE

ltltinsert_rowgtgtINSERT INTO VALORES Estadiacutesticas (pe_ratio )EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEpe_ratio = 0GOTO insert_row - no se puede poder en el bloque actualEND

Sin embargo un GOTO declaracioacuten puede rama de un manejador de excepciones en un bloque que contiene

Declaracioacuten de NULL

La NULL declaracioacuten no hace otra cosa que el control pase a la siguiente instruccioacuten En unconstructor condicional el NULL declaracioacuten dice a los lectores la posibilidad de que se haconsiderado pero no hay accioacuten que sea necesaria En el siguiente ejemplo el NULL declaracioacutendemuestra que no se toman medidas de excepcioacuten sin nombre

EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEROLLBACKCUANDO ENTONCES VALUE_ERROR

INSERT INTO VALORES errores COMMITCUANDO OTROS ENTONCESNULLEND

En IF las declaraciones u otros lugares que requieren por lo menos una sentencia ejecutableel NULL declaracioacuten para satisfacer a la sintaxis En el siguiente ejemplo el NULL declaracioacuten hacehincapieacute en que soacutelo los mejores empleados reciban bonificaciones

Si la calificacioacutengt 90 THEN

compute_bonus (emp_id)ELSENULLEND IF

Ademaacutes el NULL declaracioacuten es una forma praacutectica para crear recibos de la hora de disentildearaplicaciones de arriba hacia abajo Un taloacuten se subprograma ficticio que le permite diferir ladefinicioacuten de un procedimiento o funcioacuten hasta que probar y depurar el programa principal En elsiguiente ejemplo el NULL declaracioacuten cumple con el requisito de que al menos una declaracioacutendebe aparecer en la parte ejecutable de un subprograma

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1919

PROCEDIMIENTO debit_account (acct_id INTEGER REAL cantidad) ESCOMENZARNULLEND debit_account

Copyright copy 1996 2002 Oracle Corporation Todos los derechos reservados

Casa

Lista delibros

Contenido

Iacutendice

MasterIndex

Realiment

Page 13: programacion oracle

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1319

DateList TIPO ES LA MESA DEL IacuteNDICE DE FECHA POR BINARY_INTEGERfechas DateListINTEGER constante k = 5 - conjunto nuevo incrementoCOMENZARPara j EN 1 3 LOOPfechas (j k) = SYSDATE - se multiplican bucle contador incrementoEND LOOPEND

Rangos dinaacutemicos

PL SQL le permite determinar el rango de bucle de forma dinaacutemica en tiempo de ejecucioacuten commuestra el siguiente ejemplo

SELECT COUNT (empno) EN emp_count del EMPFOR i IN 1 LOOP emp_countEND LOOP

El valor de emp_count se desconoce en tiempo de compilacioacuten el SELECT instruccioacuten devuelve elvalor en tiempo de ejecucioacuten

iquestQueacute pasa si el liacutemite inferior de un rango de bucle evaluacutea a un entero mayor que el liacutemitesuperior Como muestra el siguiente ejemplo la secuencia de declaraciones dentro del bucle no sejecuta y el control pasa a la siguiente sentencia

- Liacutemite se convierte en unDE LOOP liacutemite i IN 2 sequence_of_statements - ejecuta cero vecesEND LOOP

- El control pasa aquiacute

Las reglas de aacutembito

El contador del bucle soacutelo se define dentro del bucle No se puede hacer referencia a eacutel fuera delbucle Despueacutes se sale del bucle el contador del bucle no estaacute definido como muestra el siguientejemplo

PARA CTR en 1 10 LOOPEND LOOPsuma = ctr - 1 - no se permite

Usted no necesita declarar expliacutecitamente el contador del bucle ya que se declara impliacutecitamentecomo una variable local de tipo INTEGER El siguiente ejemplo muestra que la declaracioacuten localoculta cualquier declaracioacuten global

DECLAREctr INTEGERCOMENZARPARA CTR en 1 25 LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1419

Si Ctrgt 10 THEN - Se refiere al contador del bucleEND LOOPEND

Para hacer referencia a la variable global en este ejemplo debe utilizar una etiqueta y la notacioacutenpuntos como sigue

ltltmaingtgtDECLAREctr INTEGERCOMENZARPARA CTR en 1 25 LOOPSI mainctrgt 10 THEN - se refiere a la variable globalEND IFEND LOOPEND principal

Las reglas del aacutembito mismo se aplica a anidar FOR bucles Considere el siguiente ejemplo Ambocontadores de bucles con el mismo nombre Por lo tanto para hacer referencia al contador del buexterno del bucle interno debe utilizar una etiqueta y la notacioacuten de puntos como sigue

ltltoutergtgtPara el paso en 1 25 LOOPPara el paso en 1 10 LOOPSI outerstepgt 15 ENTONCES END LOOP

END LOOP exterior

Utilizando la sentencia EXIT

La EXIT declaracioacuten permite una FOR vuelta completa antes de tiempo Por ejemplo el siguientebucle se ejecuta normalmente diez veces pero tan pronto como el FETCH declaracioacuten no devuelveuna fila el ciclo se completa no importa cuaacutentas veces se ha ejecutado

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA AL NOTFOUND c1

END LOOP

Suponga que usted debe salir de un anidados FOR bucle antes de tiempo Puede completar no soacutelolazo de corriente pero ninguacuten lazo de inclusioacuten Simplemente la etiqueta del bucle encierra quedesea completar A continuacioacuten utilice la etiqueta de una EXIT declaracioacuten para especificarqueacute FOR bucle de salida de la siguiente manera

ltltoutergtgtFOR i IN 1 5 LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1519

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA exterior cuando NOTFOUND c1 - salida tanto para los buclesEND LOOPEND LOOP exterior- El control pasa aquiacute

Secuencial de control GOTO y declaraciones NULL

A diferencia de la IF y LOOP declaraciones el GOTO y NULL declaraciones no son cruciales para PL SQL de programacioacuten La estructura de PL SQL es tal que el GOTO declaracioacuten es rara veznecesario De vez en cuando se puede simplificar la loacutegica suficiente como para justificar suuso La NULL declaracioacuten puede mejorar la legibilidad al hacer que el significado y la accioacuten de lasentencias condicionales claro

El uso excesivo de GOTO declaraciones puede generar un coacutedigo complejo no estructurada (a vecellamado spaghetti coacutedigo) que es difiacutecil de entender y mantener Por lo tanto el

uso GOTO declaraciones con moderacioacuten Por ejemplo para poder partir de una estructura anidadauna rutina de control de errores una excepcioacuten en lugar de utilizar un GOTO comunicado

GoTo

El GOTO ramas declaracioacuten a una etiqueta de manera incondicional La etiqueta debe ser uacutenico en alcance y debe preceder a una sentencia ejecutable o un bloque PL SQL Cuando se ejecutael GOTO transfiere el informe de control a la sentencia etiquetada o del bloque En el siguienteejemplo usted va a una sentencia ejecutable maacutes abajo en una secuencia de instrucciones

COMENZARGOTO insert_rowltltinsert_rowgtgtINSERT INTO VALORES emp END

En el siguiente ejemplo usted va a un bloque PL SQL maacutes arriba en una secuencia deinstrucciones

COMENZARltltupdate_rowgtgtCOMENZARACTUALIZACIOacuteN eacutenfasis JUEGO ENDGOTO update_rowEND

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1619

La etiqueta end_loop en el siguiente ejemplo no estaacute permitido porque no precede a una sentenciaejecutable

DECLAREhace booleanCOMENZARFOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgt - No se permiteEND LOOP - no es una sentencia ejecutableEND

Para depurar el uacuteltimo ejemplo soacutelo tiene que antildeadir el NULL declaracioacuten de la siguiente manera

FOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgtNULL - una sentencia ejecutableEND LOOP

Como muestra el siguiente ejemplo un GOTO declaracioacuten puede rama de un bloque que lo contiendesde el bloque actual

DECLAREmy_ename CHAR (10)COMENZARltltget_namegtgtSELECCIONAR Ename EN my_ename de EMP DONDE COMENZARObtiene_nombre GOTO - rama adjuntando bloqueENDEND

El GOTO ramas declaracioacuten al primer bloque encierra en el que la etiqueta se hace referencia apare

Restricciones

Algunos de los destinos posibles de un GOTO declaracioacuten no se permite En concretoun GOTO declaracioacuten no puede bifurcarse en un IF declaracioacuten CASE declaracioacuten LOOP declaracioacutensub-bloque Por ejemplo la siguiente GOTO declaracioacuten no se permite

COMENZARGOTO update_row - no se ramifican en IFSI ENTONCES vaacutelida

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1719

ltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

Como muestra el siguiente ejemplo un GOTO declaracioacuten no puede rama de un IF claacuteusula dedeclaracioacuten a otra Del mismo modo un GOTO declaracioacuten no puede rama deun CASE declaracioacuten WHEN claacuteusula a otra

COMENZARSI ENTONCES vaacutelidaGOTO update_row - no se ramifican en la claacuteusula ELSEELSEltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

El siguiente ejemplo muestra que un GOTO declaracioacuten no puede rama de un bloque que lo contienen un sub-bloque

COMENZARSi el estado = obsoletos THENGOTO delete_part - no se ramifican en sub-bloqueEND IFCOMENZAR

ltltdelete_partgtgtCANCELACIOacuteN de piezas en las ENDEND

Ademaacutes un GOTO declaracioacuten no puede ramificar hacia fuera de un subprograma como muestra esiguiente ejemplo

DECLARE

PROCEDIMIENTO compute_bonus (NUacuteMERO emp_id) ESCOMENZARGOTO update_row - no se puede ramificar hacia fuera del subprogramaENDCOMENZARltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1819

Por uacuteltimo un GOTO declaracioacuten no puede rama de un manejador de excepcioacuten en el bloqueactual Por ejemplo la siguiente GOTO declaracioacuten no se permite

DECLAREpe_ratio REALCOMENZARSelecciona el precio NVL (ingresos 0) en pe_ratio DE

ltltinsert_rowgtgtINSERT INTO VALORES Estadiacutesticas (pe_ratio )EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEpe_ratio = 0GOTO insert_row - no se puede poder en el bloque actualEND

Sin embargo un GOTO declaracioacuten puede rama de un manejador de excepciones en un bloque que contiene

Declaracioacuten de NULL

La NULL declaracioacuten no hace otra cosa que el control pase a la siguiente instruccioacuten En unconstructor condicional el NULL declaracioacuten dice a los lectores la posibilidad de que se haconsiderado pero no hay accioacuten que sea necesaria En el siguiente ejemplo el NULL declaracioacutendemuestra que no se toman medidas de excepcioacuten sin nombre

EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEROLLBACKCUANDO ENTONCES VALUE_ERROR

INSERT INTO VALORES errores COMMITCUANDO OTROS ENTONCESNULLEND

En IF las declaraciones u otros lugares que requieren por lo menos una sentencia ejecutableel NULL declaracioacuten para satisfacer a la sintaxis En el siguiente ejemplo el NULL declaracioacuten hacehincapieacute en que soacutelo los mejores empleados reciban bonificaciones

Si la calificacioacutengt 90 THEN

compute_bonus (emp_id)ELSENULLEND IF

Ademaacutes el NULL declaracioacuten es una forma praacutectica para crear recibos de la hora de disentildearaplicaciones de arriba hacia abajo Un taloacuten se subprograma ficticio que le permite diferir ladefinicioacuten de un procedimiento o funcioacuten hasta que probar y depurar el programa principal En elsiguiente ejemplo el NULL declaracioacuten cumple con el requisito de que al menos una declaracioacutendebe aparecer en la parte ejecutable de un subprograma

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1919

PROCEDIMIENTO debit_account (acct_id INTEGER REAL cantidad) ESCOMENZARNULLEND debit_account

Copyright copy 1996 2002 Oracle Corporation Todos los derechos reservados

Casa

Lista delibros

Contenido

Iacutendice

MasterIndex

Realiment

Page 14: programacion oracle

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1419

Si Ctrgt 10 THEN - Se refiere al contador del bucleEND LOOPEND

Para hacer referencia a la variable global en este ejemplo debe utilizar una etiqueta y la notacioacutenpuntos como sigue

ltltmaingtgtDECLAREctr INTEGERCOMENZARPARA CTR en 1 25 LOOPSI mainctrgt 10 THEN - se refiere a la variable globalEND IFEND LOOPEND principal

Las reglas del aacutembito mismo se aplica a anidar FOR bucles Considere el siguiente ejemplo Ambocontadores de bucles con el mismo nombre Por lo tanto para hacer referencia al contador del buexterno del bucle interno debe utilizar una etiqueta y la notacioacuten de puntos como sigue

ltltoutergtgtPara el paso en 1 25 LOOPPara el paso en 1 10 LOOPSI outerstepgt 15 ENTONCES END LOOP

END LOOP exterior

Utilizando la sentencia EXIT

La EXIT declaracioacuten permite una FOR vuelta completa antes de tiempo Por ejemplo el siguientebucle se ejecuta normalmente diez veces pero tan pronto como el FETCH declaracioacuten no devuelveuna fila el ciclo se completa no importa cuaacutentas veces se ha ejecutado

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA AL NOTFOUND c1

END LOOP

Suponga que usted debe salir de un anidados FOR bucle antes de tiempo Puede completar no soacutelolazo de corriente pero ninguacuten lazo de inclusioacuten Simplemente la etiqueta del bucle encierra quedesea completar A continuacioacuten utilice la etiqueta de una EXIT declaracioacuten para especificarqueacute FOR bucle de salida de la siguiente manera

ltltoutergtgtFOR i IN 1 5 LOOP

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1519

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA exterior cuando NOTFOUND c1 - salida tanto para los buclesEND LOOPEND LOOP exterior- El control pasa aquiacute

Secuencial de control GOTO y declaraciones NULL

A diferencia de la IF y LOOP declaraciones el GOTO y NULL declaraciones no son cruciales para PL SQL de programacioacuten La estructura de PL SQL es tal que el GOTO declaracioacuten es rara veznecesario De vez en cuando se puede simplificar la loacutegica suficiente como para justificar suuso La NULL declaracioacuten puede mejorar la legibilidad al hacer que el significado y la accioacuten de lasentencias condicionales claro

El uso excesivo de GOTO declaraciones puede generar un coacutedigo complejo no estructurada (a vecellamado spaghetti coacutedigo) que es difiacutecil de entender y mantener Por lo tanto el

uso GOTO declaraciones con moderacioacuten Por ejemplo para poder partir de una estructura anidadauna rutina de control de errores una excepcioacuten en lugar de utilizar un GOTO comunicado

GoTo

El GOTO ramas declaracioacuten a una etiqueta de manera incondicional La etiqueta debe ser uacutenico en alcance y debe preceder a una sentencia ejecutable o un bloque PL SQL Cuando se ejecutael GOTO transfiere el informe de control a la sentencia etiquetada o del bloque En el siguienteejemplo usted va a una sentencia ejecutable maacutes abajo en una secuencia de instrucciones

COMENZARGOTO insert_rowltltinsert_rowgtgtINSERT INTO VALORES emp END

En el siguiente ejemplo usted va a un bloque PL SQL maacutes arriba en una secuencia deinstrucciones

COMENZARltltupdate_rowgtgtCOMENZARACTUALIZACIOacuteN eacutenfasis JUEGO ENDGOTO update_rowEND

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1619

La etiqueta end_loop en el siguiente ejemplo no estaacute permitido porque no precede a una sentenciaejecutable

DECLAREhace booleanCOMENZARFOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgt - No se permiteEND LOOP - no es una sentencia ejecutableEND

Para depurar el uacuteltimo ejemplo soacutelo tiene que antildeadir el NULL declaracioacuten de la siguiente manera

FOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgtNULL - una sentencia ejecutableEND LOOP

Como muestra el siguiente ejemplo un GOTO declaracioacuten puede rama de un bloque que lo contiendesde el bloque actual

DECLAREmy_ename CHAR (10)COMENZARltltget_namegtgtSELECCIONAR Ename EN my_ename de EMP DONDE COMENZARObtiene_nombre GOTO - rama adjuntando bloqueENDEND

El GOTO ramas declaracioacuten al primer bloque encierra en el que la etiqueta se hace referencia apare

Restricciones

Algunos de los destinos posibles de un GOTO declaracioacuten no se permite En concretoun GOTO declaracioacuten no puede bifurcarse en un IF declaracioacuten CASE declaracioacuten LOOP declaracioacutensub-bloque Por ejemplo la siguiente GOTO declaracioacuten no se permite

COMENZARGOTO update_row - no se ramifican en IFSI ENTONCES vaacutelida

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1719

ltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

Como muestra el siguiente ejemplo un GOTO declaracioacuten no puede rama de un IF claacuteusula dedeclaracioacuten a otra Del mismo modo un GOTO declaracioacuten no puede rama deun CASE declaracioacuten WHEN claacuteusula a otra

COMENZARSI ENTONCES vaacutelidaGOTO update_row - no se ramifican en la claacuteusula ELSEELSEltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

El siguiente ejemplo muestra que un GOTO declaracioacuten no puede rama de un bloque que lo contienen un sub-bloque

COMENZARSi el estado = obsoletos THENGOTO delete_part - no se ramifican en sub-bloqueEND IFCOMENZAR

ltltdelete_partgtgtCANCELACIOacuteN de piezas en las ENDEND

Ademaacutes un GOTO declaracioacuten no puede ramificar hacia fuera de un subprograma como muestra esiguiente ejemplo

DECLARE

PROCEDIMIENTO compute_bonus (NUacuteMERO emp_id) ESCOMENZARGOTO update_row - no se puede ramificar hacia fuera del subprogramaENDCOMENZARltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1819

Por uacuteltimo un GOTO declaracioacuten no puede rama de un manejador de excepcioacuten en el bloqueactual Por ejemplo la siguiente GOTO declaracioacuten no se permite

DECLAREpe_ratio REALCOMENZARSelecciona el precio NVL (ingresos 0) en pe_ratio DE

ltltinsert_rowgtgtINSERT INTO VALORES Estadiacutesticas (pe_ratio )EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEpe_ratio = 0GOTO insert_row - no se puede poder en el bloque actualEND

Sin embargo un GOTO declaracioacuten puede rama de un manejador de excepciones en un bloque que contiene

Declaracioacuten de NULL

La NULL declaracioacuten no hace otra cosa que el control pase a la siguiente instruccioacuten En unconstructor condicional el NULL declaracioacuten dice a los lectores la posibilidad de que se haconsiderado pero no hay accioacuten que sea necesaria En el siguiente ejemplo el NULL declaracioacutendemuestra que no se toman medidas de excepcioacuten sin nombre

EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEROLLBACKCUANDO ENTONCES VALUE_ERROR

INSERT INTO VALORES errores COMMITCUANDO OTROS ENTONCESNULLEND

En IF las declaraciones u otros lugares que requieren por lo menos una sentencia ejecutableel NULL declaracioacuten para satisfacer a la sintaxis En el siguiente ejemplo el NULL declaracioacuten hacehincapieacute en que soacutelo los mejores empleados reciban bonificaciones

Si la calificacioacutengt 90 THEN

compute_bonus (emp_id)ELSENULLEND IF

Ademaacutes el NULL declaracioacuten es una forma praacutectica para crear recibos de la hora de disentildearaplicaciones de arriba hacia abajo Un taloacuten se subprograma ficticio que le permite diferir ladefinicioacuten de un procedimiento o funcioacuten hasta que probar y depurar el programa principal En elsiguiente ejemplo el NULL declaracioacuten cumple con el requisito de que al menos una declaracioacutendebe aparecer en la parte ejecutable de un subprograma

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1919

PROCEDIMIENTO debit_account (acct_id INTEGER REAL cantidad) ESCOMENZARNULLEND debit_account

Copyright copy 1996 2002 Oracle Corporation Todos los derechos reservados

Casa

Lista delibros

Contenido

Iacutendice

MasterIndex

Realiment

Page 15: programacion oracle

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1519

Para j EN 1 10 LOOPFETCH C1 en emp_recSALIDA exterior cuando NOTFOUND c1 - salida tanto para los buclesEND LOOPEND LOOP exterior- El control pasa aquiacute

Secuencial de control GOTO y declaraciones NULL

A diferencia de la IF y LOOP declaraciones el GOTO y NULL declaraciones no son cruciales para PL SQL de programacioacuten La estructura de PL SQL es tal que el GOTO declaracioacuten es rara veznecesario De vez en cuando se puede simplificar la loacutegica suficiente como para justificar suuso La NULL declaracioacuten puede mejorar la legibilidad al hacer que el significado y la accioacuten de lasentencias condicionales claro

El uso excesivo de GOTO declaraciones puede generar un coacutedigo complejo no estructurada (a vecellamado spaghetti coacutedigo) que es difiacutecil de entender y mantener Por lo tanto el

uso GOTO declaraciones con moderacioacuten Por ejemplo para poder partir de una estructura anidadauna rutina de control de errores una excepcioacuten en lugar de utilizar un GOTO comunicado

GoTo

El GOTO ramas declaracioacuten a una etiqueta de manera incondicional La etiqueta debe ser uacutenico en alcance y debe preceder a una sentencia ejecutable o un bloque PL SQL Cuando se ejecutael GOTO transfiere el informe de control a la sentencia etiquetada o del bloque En el siguienteejemplo usted va a una sentencia ejecutable maacutes abajo en una secuencia de instrucciones

COMENZARGOTO insert_rowltltinsert_rowgtgtINSERT INTO VALORES emp END

En el siguiente ejemplo usted va a un bloque PL SQL maacutes arriba en una secuencia deinstrucciones

COMENZARltltupdate_rowgtgtCOMENZARACTUALIZACIOacuteN eacutenfasis JUEGO ENDGOTO update_rowEND

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1619

La etiqueta end_loop en el siguiente ejemplo no estaacute permitido porque no precede a una sentenciaejecutable

DECLAREhace booleanCOMENZARFOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgt - No se permiteEND LOOP - no es una sentencia ejecutableEND

Para depurar el uacuteltimo ejemplo soacutelo tiene que antildeadir el NULL declaracioacuten de la siguiente manera

FOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgtNULL - una sentencia ejecutableEND LOOP

Como muestra el siguiente ejemplo un GOTO declaracioacuten puede rama de un bloque que lo contiendesde el bloque actual

DECLAREmy_ename CHAR (10)COMENZARltltget_namegtgtSELECCIONAR Ename EN my_ename de EMP DONDE COMENZARObtiene_nombre GOTO - rama adjuntando bloqueENDEND

El GOTO ramas declaracioacuten al primer bloque encierra en el que la etiqueta se hace referencia apare

Restricciones

Algunos de los destinos posibles de un GOTO declaracioacuten no se permite En concretoun GOTO declaracioacuten no puede bifurcarse en un IF declaracioacuten CASE declaracioacuten LOOP declaracioacutensub-bloque Por ejemplo la siguiente GOTO declaracioacuten no se permite

COMENZARGOTO update_row - no se ramifican en IFSI ENTONCES vaacutelida

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1719

ltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

Como muestra el siguiente ejemplo un GOTO declaracioacuten no puede rama de un IF claacuteusula dedeclaracioacuten a otra Del mismo modo un GOTO declaracioacuten no puede rama deun CASE declaracioacuten WHEN claacuteusula a otra

COMENZARSI ENTONCES vaacutelidaGOTO update_row - no se ramifican en la claacuteusula ELSEELSEltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

El siguiente ejemplo muestra que un GOTO declaracioacuten no puede rama de un bloque que lo contienen un sub-bloque

COMENZARSi el estado = obsoletos THENGOTO delete_part - no se ramifican en sub-bloqueEND IFCOMENZAR

ltltdelete_partgtgtCANCELACIOacuteN de piezas en las ENDEND

Ademaacutes un GOTO declaracioacuten no puede ramificar hacia fuera de un subprograma como muestra esiguiente ejemplo

DECLARE

PROCEDIMIENTO compute_bonus (NUacuteMERO emp_id) ESCOMENZARGOTO update_row - no se puede ramificar hacia fuera del subprogramaENDCOMENZARltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1819

Por uacuteltimo un GOTO declaracioacuten no puede rama de un manejador de excepcioacuten en el bloqueactual Por ejemplo la siguiente GOTO declaracioacuten no se permite

DECLAREpe_ratio REALCOMENZARSelecciona el precio NVL (ingresos 0) en pe_ratio DE

ltltinsert_rowgtgtINSERT INTO VALORES Estadiacutesticas (pe_ratio )EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEpe_ratio = 0GOTO insert_row - no se puede poder en el bloque actualEND

Sin embargo un GOTO declaracioacuten puede rama de un manejador de excepciones en un bloque que contiene

Declaracioacuten de NULL

La NULL declaracioacuten no hace otra cosa que el control pase a la siguiente instruccioacuten En unconstructor condicional el NULL declaracioacuten dice a los lectores la posibilidad de que se haconsiderado pero no hay accioacuten que sea necesaria En el siguiente ejemplo el NULL declaracioacutendemuestra que no se toman medidas de excepcioacuten sin nombre

EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEROLLBACKCUANDO ENTONCES VALUE_ERROR

INSERT INTO VALORES errores COMMITCUANDO OTROS ENTONCESNULLEND

En IF las declaraciones u otros lugares que requieren por lo menos una sentencia ejecutableel NULL declaracioacuten para satisfacer a la sintaxis En el siguiente ejemplo el NULL declaracioacuten hacehincapieacute en que soacutelo los mejores empleados reciban bonificaciones

Si la calificacioacutengt 90 THEN

compute_bonus (emp_id)ELSENULLEND IF

Ademaacutes el NULL declaracioacuten es una forma praacutectica para crear recibos de la hora de disentildearaplicaciones de arriba hacia abajo Un taloacuten se subprograma ficticio que le permite diferir ladefinicioacuten de un procedimiento o funcioacuten hasta que probar y depurar el programa principal En elsiguiente ejemplo el NULL declaracioacuten cumple con el requisito de que al menos una declaracioacutendebe aparecer en la parte ejecutable de un subprograma

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1919

PROCEDIMIENTO debit_account (acct_id INTEGER REAL cantidad) ESCOMENZARNULLEND debit_account

Copyright copy 1996 2002 Oracle Corporation Todos los derechos reservados

Casa

Lista delibros

Contenido

Iacutendice

MasterIndex

Realiment

Page 16: programacion oracle

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1619

La etiqueta end_loop en el siguiente ejemplo no estaacute permitido porque no precede a una sentenciaejecutable

DECLAREhace booleanCOMENZARFOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgt - No se permiteEND LOOP - no es una sentencia ejecutableEND

Para depurar el uacuteltimo ejemplo soacutelo tiene que antildeadir el NULL declaracioacuten de la siguiente manera

FOR i IN 1 50 LOOPSi se hace ENTONCES

GOTO end_loopEND IFltltend_loopgtgtNULL - una sentencia ejecutableEND LOOP

Como muestra el siguiente ejemplo un GOTO declaracioacuten puede rama de un bloque que lo contiendesde el bloque actual

DECLAREmy_ename CHAR (10)COMENZARltltget_namegtgtSELECCIONAR Ename EN my_ename de EMP DONDE COMENZARObtiene_nombre GOTO - rama adjuntando bloqueENDEND

El GOTO ramas declaracioacuten al primer bloque encierra en el que la etiqueta se hace referencia apare

Restricciones

Algunos de los destinos posibles de un GOTO declaracioacuten no se permite En concretoun GOTO declaracioacuten no puede bifurcarse en un IF declaracioacuten CASE declaracioacuten LOOP declaracioacutensub-bloque Por ejemplo la siguiente GOTO declaracioacuten no se permite

COMENZARGOTO update_row - no se ramifican en IFSI ENTONCES vaacutelida

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1719

ltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

Como muestra el siguiente ejemplo un GOTO declaracioacuten no puede rama de un IF claacuteusula dedeclaracioacuten a otra Del mismo modo un GOTO declaracioacuten no puede rama deun CASE declaracioacuten WHEN claacuteusula a otra

COMENZARSI ENTONCES vaacutelidaGOTO update_row - no se ramifican en la claacuteusula ELSEELSEltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

El siguiente ejemplo muestra que un GOTO declaracioacuten no puede rama de un bloque que lo contienen un sub-bloque

COMENZARSi el estado = obsoletos THENGOTO delete_part - no se ramifican en sub-bloqueEND IFCOMENZAR

ltltdelete_partgtgtCANCELACIOacuteN de piezas en las ENDEND

Ademaacutes un GOTO declaracioacuten no puede ramificar hacia fuera de un subprograma como muestra esiguiente ejemplo

DECLARE

PROCEDIMIENTO compute_bonus (NUacuteMERO emp_id) ESCOMENZARGOTO update_row - no se puede ramificar hacia fuera del subprogramaENDCOMENZARltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1819

Por uacuteltimo un GOTO declaracioacuten no puede rama de un manejador de excepcioacuten en el bloqueactual Por ejemplo la siguiente GOTO declaracioacuten no se permite

DECLAREpe_ratio REALCOMENZARSelecciona el precio NVL (ingresos 0) en pe_ratio DE

ltltinsert_rowgtgtINSERT INTO VALORES Estadiacutesticas (pe_ratio )EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEpe_ratio = 0GOTO insert_row - no se puede poder en el bloque actualEND

Sin embargo un GOTO declaracioacuten puede rama de un manejador de excepciones en un bloque que contiene

Declaracioacuten de NULL

La NULL declaracioacuten no hace otra cosa que el control pase a la siguiente instruccioacuten En unconstructor condicional el NULL declaracioacuten dice a los lectores la posibilidad de que se haconsiderado pero no hay accioacuten que sea necesaria En el siguiente ejemplo el NULL declaracioacutendemuestra que no se toman medidas de excepcioacuten sin nombre

EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEROLLBACKCUANDO ENTONCES VALUE_ERROR

INSERT INTO VALORES errores COMMITCUANDO OTROS ENTONCESNULLEND

En IF las declaraciones u otros lugares que requieren por lo menos una sentencia ejecutableel NULL declaracioacuten para satisfacer a la sintaxis En el siguiente ejemplo el NULL declaracioacuten hacehincapieacute en que soacutelo los mejores empleados reciban bonificaciones

Si la calificacioacutengt 90 THEN

compute_bonus (emp_id)ELSENULLEND IF

Ademaacutes el NULL declaracioacuten es una forma praacutectica para crear recibos de la hora de disentildearaplicaciones de arriba hacia abajo Un taloacuten se subprograma ficticio que le permite diferir ladefinicioacuten de un procedimiento o funcioacuten hasta que probar y depurar el programa principal En elsiguiente ejemplo el NULL declaracioacuten cumple con el requisito de que al menos una declaracioacutendebe aparecer en la parte ejecutable de un subprograma

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1919

PROCEDIMIENTO debit_account (acct_id INTEGER REAL cantidad) ESCOMENZARNULLEND debit_account

Copyright copy 1996 2002 Oracle Corporation Todos los derechos reservados

Casa

Lista delibros

Contenido

Iacutendice

MasterIndex

Realiment

Page 17: programacion oracle

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1719

ltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

Como muestra el siguiente ejemplo un GOTO declaracioacuten no puede rama de un IF claacuteusula dedeclaracioacuten a otra Del mismo modo un GOTO declaracioacuten no puede rama deun CASE declaracioacuten WHEN claacuteusula a otra

COMENZARSI ENTONCES vaacutelidaGOTO update_row - no se ramifican en la claacuteusula ELSEELSEltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END IFEND

El siguiente ejemplo muestra que un GOTO declaracioacuten no puede rama de un bloque que lo contienen un sub-bloque

COMENZARSi el estado = obsoletos THENGOTO delete_part - no se ramifican en sub-bloqueEND IFCOMENZAR

ltltdelete_partgtgtCANCELACIOacuteN de piezas en las ENDEND

Ademaacutes un GOTO declaracioacuten no puede ramificar hacia fuera de un subprograma como muestra esiguiente ejemplo

DECLARE

PROCEDIMIENTO compute_bonus (NUacuteMERO emp_id) ESCOMENZARGOTO update_row - no se puede ramificar hacia fuera del subprogramaENDCOMENZARltltupdate_rowgtgtACTUALIZACIOacuteN eacutenfasis JUEGO END

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1819

Por uacuteltimo un GOTO declaracioacuten no puede rama de un manejador de excepcioacuten en el bloqueactual Por ejemplo la siguiente GOTO declaracioacuten no se permite

DECLAREpe_ratio REALCOMENZARSelecciona el precio NVL (ingresos 0) en pe_ratio DE

ltltinsert_rowgtgtINSERT INTO VALORES Estadiacutesticas (pe_ratio )EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEpe_ratio = 0GOTO insert_row - no se puede poder en el bloque actualEND

Sin embargo un GOTO declaracioacuten puede rama de un manejador de excepciones en un bloque que contiene

Declaracioacuten de NULL

La NULL declaracioacuten no hace otra cosa que el control pase a la siguiente instruccioacuten En unconstructor condicional el NULL declaracioacuten dice a los lectores la posibilidad de que se haconsiderado pero no hay accioacuten que sea necesaria En el siguiente ejemplo el NULL declaracioacutendemuestra que no se toman medidas de excepcioacuten sin nombre

EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEROLLBACKCUANDO ENTONCES VALUE_ERROR

INSERT INTO VALORES errores COMMITCUANDO OTROS ENTONCESNULLEND

En IF las declaraciones u otros lugares que requieren por lo menos una sentencia ejecutableel NULL declaracioacuten para satisfacer a la sintaxis En el siguiente ejemplo el NULL declaracioacuten hacehincapieacute en que soacutelo los mejores empleados reciban bonificaciones

Si la calificacioacutengt 90 THEN

compute_bonus (emp_id)ELSENULLEND IF

Ademaacutes el NULL declaracioacuten es una forma praacutectica para crear recibos de la hora de disentildearaplicaciones de arriba hacia abajo Un taloacuten se subprograma ficticio que le permite diferir ladefinicioacuten de un procedimiento o funcioacuten hasta que probar y depurar el programa principal En elsiguiente ejemplo el NULL declaracioacuten cumple con el requisito de que al menos una declaracioacutendebe aparecer en la parte ejecutable de un subprograma

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1919

PROCEDIMIENTO debit_account (acct_id INTEGER REAL cantidad) ESCOMENZARNULLEND debit_account

Copyright copy 1996 2002 Oracle Corporation Todos los derechos reservados

Casa

Lista delibros

Contenido

Iacutendice

MasterIndex

Realiment

Page 18: programacion oracle

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1819

Por uacuteltimo un GOTO declaracioacuten no puede rama de un manejador de excepcioacuten en el bloqueactual Por ejemplo la siguiente GOTO declaracioacuten no se permite

DECLAREpe_ratio REALCOMENZARSelecciona el precio NVL (ingresos 0) en pe_ratio DE

ltltinsert_rowgtgtINSERT INTO VALORES Estadiacutesticas (pe_ratio )EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEpe_ratio = 0GOTO insert_row - no se puede poder en el bloque actualEND

Sin embargo un GOTO declaracioacuten puede rama de un manejador de excepciones en un bloque que contiene

Declaracioacuten de NULL

La NULL declaracioacuten no hace otra cosa que el control pase a la siguiente instruccioacuten En unconstructor condicional el NULL declaracioacuten dice a los lectores la posibilidad de que se haconsiderado pero no hay accioacuten que sea necesaria En el siguiente ejemplo el NULL declaracioacutendemuestra que no se toman medidas de excepcioacuten sin nombre

EXCEPCIOacuteNCUANDO ENTONCES ZERO_DIVIDEROLLBACKCUANDO ENTONCES VALUE_ERROR

INSERT INTO VALORES errores COMMITCUANDO OTROS ENTONCESNULLEND

En IF las declaraciones u otros lugares que requieren por lo menos una sentencia ejecutableel NULL declaracioacuten para satisfacer a la sintaxis En el siguiente ejemplo el NULL declaracioacuten hacehincapieacute en que soacutelo los mejores empleados reciban bonificaciones

Si la calificacioacutengt 90 THEN

compute_bonus (emp_id)ELSENULLEND IF

Ademaacutes el NULL declaracioacuten es una forma praacutectica para crear recibos de la hora de disentildearaplicaciones de arriba hacia abajo Un taloacuten se subprograma ficticio que le permite diferir ladefinicioacuten de un procedimiento o funcioacuten hasta que probar y depurar el programa principal En elsiguiente ejemplo el NULL declaracioacuten cumple con el requisito de que al menos una declaracioacutendebe aparecer en la parte ejecutable de un subprograma

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1919

PROCEDIMIENTO debit_account (acct_id INTEGER REAL cantidad) ESCOMENZARNULLEND debit_account

Copyright copy 1996 2002 Oracle Corporation Todos los derechos reservados

Casa

Lista delibros

Contenido

Iacutendice

MasterIndex

Realiment

Page 19: programacion oracle

5122018 programacion oracle - slidepdfcom

httpslidepdfcomreaderfullprogramacion-oracle 1919

PROCEDIMIENTO debit_account (acct_id INTEGER REAL cantidad) ESCOMENZARNULLEND debit_account

Copyright copy 1996 2002 Oracle Corporation Todos los derechos reservados

Casa

Lista delibros

Contenido

Iacutendice

MasterIndex

Realiment