creación de estructuras de controlcondicionales y estructuras de control de bucles. • sentencias...
TRANSCRIPT
Copyright Oracle Corporation, 1998. All rights reserved.
66
Creación de Estructuras de Control
Creación de Estructuras de Control
6-2 Copyright Oracle Corporation, 1998. All rights reserved.
ObjetivosObjetivos
Al final de esta lección será capaz de:
• Identificar los usos y tipos de las estructuras de control
• Generar una sentencia IF
• Generar e identificar distintas sentencias de bucle
• Utilizar tablas lógicas
• Controlar el flujo de bloques utilizando etiquetas y bucles anidados
Al final de esta lecciAl final de esta lecci óón sern ser áá capaz de:capaz de:
• Identificar los usos y tipos de las estructuras de control
• Generar una sentencia IF
• Generar e identificar distintas sentencias de bucle
• Utilizar tablas lógicas
• Controlar el flujo de bloques utilizando etiquetas y bucles anidados
6-3 Copyright Oracle Corporation, 1998. All rights reserved.
Control del Flujo de Ejecución PL/SQL
Control del Flujo de Ejecución PL/SQL
Puede modificar el flujo lógico de sentencias utilizando sentencias IF condicionales y estructuras de control de bucles.
• Sentencias IF condicionales:
– IF-THEN
– IF-THEN-ELSE
– IF-THEN-ELSIF
Puede modificar el flujo lPuede modificar el flujo l óógico de gico de sentencias utilizando sentencias IF sentencias utilizando sentencias IF condicionales y estructuras de control de condicionales y estructuras de control de bucles. bucles.
• Sentencias IF condicionales:
– IF-THEN
– IF-THEN-ELSE
– IF-THEN-ELSIF
6-4 Copyright Oracle Corporation, 1998. All rights reserved.
Sentencias IFSentencias IF
IF condition THENstatements;
[ELSIF condition THEN statements;]
[ELSE statements;]
END IF;
IF condition THENstatements;
[ELSIF condition THEN statements;]
[ELSE statements;]
END IF;
Sintaxis
Sentencia IF Simple:
Establezca el ID del gestor en 22 si el ombre del empleado es Osborne.
SintaxisSintaxis
Sentencia IF Simple:Sentencia IF Simple:
Establezca el ID del gestor en 22 si el Establezca el ID del gestor en 22 si el ombre del empleado es Osborne. ombre del empleado es Osborne. IF v_ename = ' OSBORNE' THEN
v_mgr := 22;END IF;
IF v_ename = ' OSBORNE' THEN v_mgr := 22;
END IF;
6-5 Copyright Oracle Corporation, 1998. All rights reserved.
Sentencias IF SimplesSentencias IF Simples
Establezca el título de empleo en Vendedor, el n úmero de departamento en 35 y la comisión en el 20% del salario actual si el apellido es Miller.
Ejemplo
Establezca el tEstablezca el t íítulo de empleo en tulo de empleo en Vendedor, el nVendedor, el n úúmero de departamento en mero de departamento en 35 y la comisi35 y la comisi óón en el 20% del salario n en el 20% del salario actual si el apellido es Miller.actual si el apellido es Miller.
EjemploEjemplo
. . .IF v_ename = 'MILLER' THEN
v_job := 'SALESMAN'; v_deptno := 35;v_new_comm := sal * 0.20;
END IF;. . .
. . .IF v_ename = 'MILLER' THEN
v_job := 'SALESMAN'; v_deptno := 35;v_new_comm := sal * 0.20;
END IF;. . .
6-6 Copyright Oracle Corporation, 1998. All rights reserved.
Flujo de Ejecución de la Sentencia IF -THEN-ELSEFlujo de Ejecución de la Sentencia IF -THEN-ELSE
Acciones ELSE(incluyendo otros IFs)
Acciones ELSEAcciones ELSE(incluyendo otros IFs)(incluyendo otros IFs)
FALSEFALSE
Acciones THEN(incluyendo otros IFs)
Acciones THENAcciones THEN(incluyendo otros IFs)(incluyendo otros IFs)
CondiciCondici óón IFn IFTRUETRUE
6-7 Copyright Oracle Corporation, 1998. All rights reserved.
Sentencias IF -THEN-ELSESentencias IF -THEN-ELSE
Establezca un indicador para los pedidos en los que hay menos de 5 d ías entre la fecha de pedido y la fecha de envío.
Ejemplo
Establezca un indicador para los pedidos Establezca un indicador para los pedidos en los que hay menos de 5 den los que hay menos de 5 d íías entre la as entre la fecha de pedido y la fecha de envfecha de pedido y la fecha de env íío. o.
EjemploEjemplo
...IF v_shipdate - v_orderdate < 5 THEN
v_ship_flag := 'Acceptable';ELSE
v_ship_flag := 'Unacceptable';END IF;...
...IF v_shipdate - v_orderdate < 5 THEN
v_ship_flag := 'Acceptable';ELSE
v_ship_flag := 'Unacceptable';END IF;...
6-8 Copyright Oracle Corporation, 1998. All rights reserved.
Sentencias IF -THEN-ELSIFSentencias IF -THEN-ELSIF
Para un valor introducido concreto, devuelva un valor calculado.
Ejemplo
Para un valor introducido concreto, Para un valor introducido concreto, devuelva un valor calculado.devuelva un valor calculado.
EjemploEjemplo
. . .IF v_start > 100 THEN
RETURN (2 * v_start);ELSIF v_start >= 50 THEN
RETURN (.5 * v_start);ELSE
RETURN (.1 * v_start);END IF;. . .
. . .IF v_start > 100 THEN
RETURN (2 * v_start);ELSIF v_start >= 50 THEN
RETURN (.5 * v_start);ELSE
RETURN (.1 * v_start);END IF;. . .
6-9 Copyright Oracle Corporation, 1998. All rights reserved.
Flujo de Ejecución de la Sentencia IF -THEN-ELSIFFlujo de Ejecución de la
Sentencia IF -THEN-ELSIF
FALSEFALSE
Condición ELSIF
CondiciCondici óón n ELSIFELSIF
Acciones THENAcciones THENAcciones THEN
TRUETRUE
Acciones ELSE
Acciones Acciones ELSEELSE
FALSEFALSEAcciones THENAcciones THENAcciones THEN
Condición IFCondiciCondici óón IFn IFTRUETRUE
6-10 Copyright Oracle Corporation, 1998. All rights reserved.
Generación de Condiciones Lógicas
Generación de Condiciones Lógicas
• Puede manejar los valores nulos con el operador IS NULL.
• Las expresiones que contienen un valor nulo resultan en NULL.
• Las expresiones concatenadas con valores nulos tranta los valores nulos como a una cadena vacía.
• Puede manejar los valores nulos con el operador IS NULL.
• Las expresiones que contienen un valor nulo resultan en NULL.
• Las expresiones concatenadas con valores nulos tranta los valores nulos como a una cadena vacía.
6-11 Copyright Oracle Corporation, 1998. All rights reserved.
Tablas L ógicasTablas L ógicas
Genere una simple condición booleana con un operador de comparación. Genere una simple condiciGenere una simple condici óón booleana n booleana con un operador de comparacicon un operador de comparaci óón. n.
NOT
TRUE
FALSE
NULL
OR
TRUE
FALSE
NULL
TRUE FALSE NULL
FALSE
TRUE
NULL
AND
TRUE
FALSE
NULL
TRUE FALSE NULL
TRUE
NULL NULL
NULL
FALSE FALSE
FALSE
FALSE
FALSE
TRUE
TRUE
TRUE
TRUETRUE
FALSE
NULL NULL
NULL
6-12 Copyright Oracle Corporation, 1998. All rights reserved.
Condiciones BooleanasCondiciones Booleanas
¿Cuál es el valor de V_FLAG en cada caso?¿¿CuCuáál es el valor de V_FLAG en cada l es el valor de V_FLAG en cada caso?caso?
V_REORDER_FLAG V_AVAILABLE_FLAG V_FLAG
TRUE TRUE
TRUE FALSE
NULL TRUE
NULL FALSE
v_flag := v_reorder_flag AND v_available_flag; v_flag := v_reorder_flag AND v_available_flag;
TRUETRUE
FALSEFALSE
NULLNULL
FALSEFALSE
6-13 Copyright Oracle Corporation, 1998. All rights reserved.
Control iterativo: Sentencias LOOP
Control iterativo: Sentencias LOOP
• Los bucles repiten una sentencia o una secuencia de sentencias varias veces.
• Hay tres tipos de bucles:
– Bucle b ásico
– Bucle FOR
– Bucle WHILE
• Los bucles repiten una sentencia o una secuencia de sentencias varias veces.
• Hay tres tipos de bucles:
– Bucle b ásico
– Bucle FOR
– Bucle WHILE
6-14 Copyright Oracle Corporation, 1998. All rights reserved.
Bucle B ásico Bucle B ásico
SintaxisSintaxisSintaxis
LOOP statement1;. . .EXIT [WHEN condition];
END LOOP;
LOOP statement1;. . .EXIT [WHEN condition];
END LOOP;
donde: condition es una expresión o variablebooleana (TRUE, FALSE,oNULL);
donde: condition es una expresión o variablebooleana (TRUE, FALSE,oNULL);
---- delimiterdelimiter
---- statementsstatements
---- EXIT statementEXIT statement
---- delimiterdelimiter
6-15 Copyright Oracle Corporation, 1998. All rights reserved.
Bucle B ásicoBucle B ásico
. . .v_ordid item.ordid%TYPE := 101;v_counter NUMBER(2) := 1;
BEGIN. . .
LOOPINSERT INTO item(ordid, itemid)
VALUES(v_ordid, v_counter);v_counter := v_counter + 1;EXIT WHEN v_counter > 10;
END LOOP;. . .
. . .v_ordid item.ordid%TYPE := 101;v_counter NUMBER(2) := 1;
BEGIN. . .
LOOPINSERT INTO item(ordid, itemid)
VALUES(v_ordid, v_counter);v_counter := v_counter + 1;EXIT WHEN v_counter > 10;
END LOOP;. . .
EjemploEjemploEjemplo
6-16 Copyright Oracle Corporation, 1998. All rights reserved.
Bucle FORBucle FORSintaxis
• Utilice un bucle FOR para reducir el número de repeticiones.
• No declare el índice; se declara implícitamente.
SintaxisSintaxis
• Utilice un bucle FOR para reducir el número de repeticiones.
• No declare el índice; se declara implícitamente.
FOR index in [REVERSE] lower_bound..upper_bound LOOP
statement1;statement2;. . .
END LOOP;
FOR index in [REVERSE] lower_bound..upper_bound LOOP
statement1;statement2;. . .
END LOOP;
6-17 Copyright Oracle Corporation, 1998. All rights reserved.
Bucle FORBucle FORDirectrices
• Haga referencia únicamente al índice que está dentro del bucle; fuera del bucle no está definido.
• Utilice una expresión para hacer referencia al valor existente de un índice.
• No haga referencia al índice como objetivo de una asignación.
DirectricesDirectrices
• Haga referencia únicamente al índice que está dentro del bucle; fuera del bucle no está definido.
• Utilice una expresión para hacer referencia al valor existente de un índice.
• No haga referencia al índice como objetivo de una asignación.
6-18 Copyright Oracle Corporation, 1998. All rights reserved.
Bucle FORBucle FORInserte los 10 primeros artículos nuevos de líena del pedido n úmero 101.
Ejemplo
Inserte los 10 primeros artInserte los 10 primeros art íículos nuevos de culos nuevos de ll ííena del pedido nena del pedido n úúmero 101. mero 101.
EjemploEjemplo
. . .v_ordid item.ordid%TYPE := 101;
BEGIN. . .
FOR i IN 1..10 LOOPINSERT INTO item(ordid, itemid)
VALUES(v_ordid, i);END LOOP;
. . .
. . .v_ordid item.ordid%TYPE := 101;
BEGIN. . .
FOR i IN 1..10 LOOPINSERT INTO item(ordid, itemid)
VALUES(v_ordid, i);END LOOP;
. . .
6-19 Copyright Oracle Corporation, 1998. All rights reserved.
Bucle WHILEBucle WHILE
Sintaxis
Utilice el bucle WHILE para repetir sentencias mientras haya una condición TRUE
SintaxisSintaxis
Utilice el bucle WHILE para repetir Utilice el bucle WHILE para repetir sentencias mientras haya una condicisentencias mientras haya una condici óón n TRUETRUE
WHILE condition LOOPstatement1;statement2;. . .
END LOOP;
WHILE condition LOOPstatement1;statement2;. . .
END LOOP;
Condition isCondition isevaluated at the evaluated at the beginning ofbeginning ofeach iteration.each iteration.
6-20 Copyright Oracle Corporation, 1998. All rights reserved.
Loop WHILELoop WHILEEjemploEjemploEjemplo
ACCEPT p_price PROMPT ‘Enter the price of the item: ‘ACCEPT p_itemtot PROMPT ‘Enter the maximum total fo r
purchase of item: ‘DECLARE...v_qty NUMBER(8) := 1;v_running_total NUMBER(7,2) := 0;BEGIN
...WHILE v_running_total < &p_itemtot LOOP
...v_qty := v_qty + 1;v_running_total := v_qty * p_price;END LOOP;
...
ACCEPT p_price PROMPT ‘Enter the price of the item: ‘ACCEPT p_itemtot PROMPT ‘Enter the maximum total fo r
purchase of item: ‘DECLARE...v_qty NUMBER(8) := 1;v_running_total NUMBER(7,2) := 0;BEGIN
...WHILE v_running_total < &p_itemtot LOOP
...v_qty := v_qty + 1;v_running_total := v_qty * p_price;END LOOP;
...
6-21 Copyright Oracle Corporation, 1998. All rights reserved.
Etiquetas y Loops AnidadosEtiquetas y Loops Anidados
• Anide bucles a varios niveles.
• Utilice etiquetas para distinguir entre los bloques y los bucles.
• Salga del bucle externo con la sentencia EXIT que hace referencia a la etiqueta.
• Anide bucles a varios niveles.
• Utilice etiquetas para distinguir entre los bloques y los bucles.
• Salga del bucle externo con la sentencia EXIT que hace referencia a la etiqueta.
6-22 Copyright Oracle Corporation, 1998. All rights reserved.
Etiquetas y Loops AnidadosEtiquetas y Loops Anidados
...BEGIN
<<Outer_loop>>LOOP
v_counter :=v_counter+1;EXIT WHEN v_counter>10;
<<Inner_loop>>LOOP
...EXIT Outer_loop WHEN total_done = ' YES' ;-- Leave both loopsEXIT WHEN inner_done = ' YES' ;-- Leave inner loop only...
END LOOP Inner_loop;...
END LOOP Outer_loop;END;
...BEGIN
<<Outer_loop>>LOOP
v_counter :=v_counter+1;EXIT WHEN v_counter>10;
<<Inner_loop>>LOOP
...EXIT Outer_loop WHEN total_done = ' YES' ;-- Leave both loopsEXIT WHEN inner_ done = ' YES' ;-- Leave inner loop only...
END LOOP Inner_loop ;...
END LOOP Outer_loop ;END;
6-23 Copyright Oracle Corporation, 1998. All rights reserved.
Cambie el flujo lógico de sentencia utilizando estructuras de control.
• Condicional (sentencia IF)
– IF THEN
– IF-THEN-ELSE
– IF-THEN-ELSIF
Cambie el flujo lCambie el flujo l óógico de sentencia gico de sentencia utilizando estructuras de control. utilizando estructuras de control.
• Condicional (sentencia IF)
– IF THEN
– IF-THEN-ELSE
– IF-THEN-ELSIF
ResumenResumen
6-24 Copyright Oracle Corporation, 1998. All rights reserved.
• Loops
– Loop b ásico
– Loop FOR
– Loop WHILE
– Sentencia EXIT
• Loops
– Loop b ásico
– Loop FOR
– Loop WHILE
– Sentencia EXIT
ResumenResumen
6-25 Copyright Oracle Corporation, 1998. All rights reserved.
Visión General de la PrácticaVisión General de la Práctica
• Ejecución de acciones condicionales utilizando la sentencia IF
• Ejecución de iteraciones utilizando la estructura bucle
• Ejecución de acciones condicionales utilizando la sentencia IF
• Ejecución de iteraciones utilizando la estructura bucle