sesion07- estructuras de control (oracle)

9
/* Sesión06 – Estructuras de control Estudiante: José Luis Toro Alcarraz Curso: Base de Datos Avanzado II Correo:[email protected] */ Objetivos de la sesión. Usar adecuadamente las estructuras de control IF. Usar adecuadamente las estructuras de control LOOP. 1) Control de Flujo en bloques PL/SQL (Estructuras de control) 2) Uso de CASE 3) Sentencias LOOP 4) Sentencia GOTO 1) Control de Flujo en bloques PL/SQL (Estructuras de control) En PL/SQL solo disponemos de la estructura condicional IF. Su sintaxis se muestra a continuación: IF (expresion) THEN -- Instrucciones ELSIF (expresion) THEN -- Instrucciones ELSE -- Instrucciones END IF; a) Sentencia IF – THEN – ELSE Es similar a la estructura de la sentencia IF de otros lenguajes. Permite a PL/SQL realizar acciones en forma selectiva, dependiendo de las condiciones que se cumplen. Las cláusulas ELSIF y ELSE son opcionales, y puede haber tantas cláusulas ELSIF como se desee. Ejemplo: DECLARE v_comision number(4,2):=10;

Upload: jose-toro

Post on 13-Jun-2015

1.291 views

Category:

Education


1 download

DESCRIPTION

Este minitutorial tiene como objetivo captar todos los conceptos dictados en cada sesión en el curso de Base de Datos Avanzado II, así como brindar apoyo a los alumnos de la carrera técnica de Computación e Informática, que por algún motivo no hayan asistido a clases. UNIDAD 4. Programación en Oracle Logro de la Unidad de Aprendizaje Al término de la unidad, el alumno construye programas estructurados utilizando el lenguaje PL/SQL dentro del manejador de base de datos Oracle. Incorpora cursores para procesar grandes volúmenes de información y gestiona los posibles errores de ejecución con el uso de excepciones. Temario 4.2 Tema 7: ESTRUCTURAS DE CONTROL EN PL/SQL 4.2.1 Estructuras Condicionales 4.2.2 Estructuras Cíclicas

TRANSCRIPT

Page 1: Sesion07- Estructuras de control (Oracle)

/* Sesión06 – Estructuras de controlEstudiante: José Luis Toro AlcarrazCurso: Base de Datos Avanzado IICorreo:[email protected]*/

Objetivos de la sesión.

Usar adecuadamente las estructuras de control IF. Usar adecuadamente las estructuras de control LOOP.

1) Control de Flujo en bloques PL/SQL (Estructuras de control)2) Uso de CASE3) Sentencias LOOP4) Sentencia GOTO

1) Control de Flujo en bloques PL/SQL (Estructuras de control)

En PL/SQL solo disponemos de la estructura condicional IF. Su sintaxis se muestra a continuación:

IF (expresion) THEN -- InstruccionesELSIF (expresion) THEN -- InstruccionesELSE -- InstruccionesEND IF;

a) Sentencia IF – THEN – ELSE

Es similar a la estructura de la sentencia IF de otros lenguajes. Permite a PL/SQL realizar acciones en forma selectiva, dependiendo de las condiciones

que se cumplen. Las cláusulas ELSIF y ELSE son opcionales, y puede haber tantas cláusulas ELSIF como

se desee.

Ejemplo:

DECLARE v_comision number(4,2):=10;BEGIN IF v_comision IS NULL THEN

dbms_output.put_line('La comisión es nula'); ELSIF v_comision > 0 THEN

dbms_output.put_line('Comisión es mayor a cero'); ELSIF v_comision < 0 THEN

dbms_output.put_line('Comisión es negativa'); ELSE

dbms_output.put_line('Comisión es cero.');

Page 2: Sesion07- Estructuras de control (Oracle)

END IF;END;/

Recomendaciones:

Cualquier comparación simple que contenga un valor nulo retorna NULL como resultado. Una comparación IS NULL retorna como resultado TRUE o FALSE. La negación de un valor nulo retorna NULL como resultado, puesto que los valores nulos

son indeterminados.

Ejemplo2:

DECLAREV_NUMERO1 NUMBER(4,2):=5;V_NUMERO2 NUMBER(4,2);

BEGINIF V_NUMERO1<> V_NUMERO2 THEN

dbms_output.put_line('SON DIFERENTES');ELSE

dbms_output.put_line('SON IGUALES');END IF;

END;/

Nota: Un aspecto a tener en cuenta es que la instrucción condicional anidada es ELSIF y no "ELSE IF". 2) Uso de CASE

La instrucción CASE permite realizar una ejecución condicional, al igual que la instrucción IF, sin embargo la instrucción CASE se adapta especialmente bien a las condiciones que implican numerosas opciones diferentes. Además el uso del CASE puede mejorar el rendimiento durante la ejecución.

Ejemplo1:

DECLAREv_comision number(4,2);

BEGIN CASE WHEN v_comision IS NULL THEN

dbms_output.put_line('La comisión es nula'); WHEN v_comision > 0 THEN

dbms_output.put_line('Comisión es mayor a cero'); WHEN v_comision < 0 THEN

dbms_output.put_line('Comisión es negativa'); ELSE

dbms_output.put_line('Comisión es cero.');

Page 3: Sesion07- Estructuras de control (Oracle)

END CASE;END;/

Ejemplo2:

DECLARE v_comision number(4,2);BEGIN CASE v_comision WHEN NULL THEN

dbms_output.put_line('La comisión es nula'); WHEN 10 THEN

dbms_output.put_line('Comisión es diez'); WHEN 20 THEN

dbms_output.put_line('Comisión es veinte'); ELSE

dbms_output.put_line('Comisión no es ni 10 ni 20.'); END CASE;END;/

3) Sentencias LOOP

En PL/SQL tenemos a nuestra disposición los siguientes iteradores o bucles:

a) LOOPb) WHILEc) FOR

a) Bucle LOOP.

El bucle LOOP, se repite tantas veces como sea necesario hasta que se fuerza su salida con la instrucción EXIT. Su sintaxis es la siguiente.

LOOP -- Instrucciones IF (expresion) THEN -- Instrucciones

EXIT; END IF;END LOOP;

Ejemplo:

-- Mostrar el valor de un contador en cada cicloDECLARE

v_cont_n NUMBER:=0;BEGIN

Dbms_output.put_line('Inicio del Loop : ' || TO_CHAR(sysdate,'HH24:MI:SS'));

Page 4: Sesion07- Estructuras de control (Oracle)

LOOPDbms_output.put_line('El contador es : ' || v_cont_n);v_cont_n := v_cont_n + 1;EXIT WHEN v_cont_n = 20;

END LOOP;Dbms_output.put_line('Fin del Loop : ' || TO_CHAR(sysdate,'HH24:MI:SS'));

END;/

b) Bucle WHILE.

El bucle WHILE, se repite mientras que se cumpla la expresión su sintaxis es la siguiente.

WHILE (expresion) LOOP -- InstruccionesEND LOOP;

Ejemplo:

-- Mostrar los números del 1 al 20 si son pares o imparesDECLARE

v_cont_n NUMBER:=1;BEGIN

WHILE v_cont_n <= 20 LOOPIF MOD(v_cont_n,2) = 0 THEN

Dbms_output.put_line(v_cont_n || ' es par.');ELSE

Dbms_output.put_line(v_cont_n || ' es impar.');END IF;v_cont_n := v_cont_n + 1;

END LOOP;END;/

c) Bucle FOR.

El bucle FOR, se repite tanta veces como le indiquemos en los identificadores inicio y final.En el caso de especificar REVERSE el bucle se recorre en sentido inverso.

FOR contador IN [REVERSE] inicio..final LOOP -- InstruccionesEND LOOP;

Ejemplo:

-- Mostrar los números múltiplos de 3 y/o 5 entre el 1 y el 100 usando FORBEGIN

FOR i IN 1..100 LOOPIF MOD(i,3) = 0 AND MOD(i,5) = 0 THEN

Dbms_output.put_line(i || ' es múltiplo de 3 y de 5.');

Page 5: Sesion07- Estructuras de control (Oracle)

ELSIF MOD(I,3) = 0 THENDbms_output.put_line(i || ' es múltiplo de 3.');

ELSIF MOD(I,5) = 0 THENDbms_output.put_line(i || ' es múltiplo de 5.');

ELSEDbms_output.put_line(i || ' no es múltiplo ni de 3 ni de 5.');

END IF;END LOOP;

END;/

4) Sentencia GOTO.

PL/SQL dispone de la sentencia GOTO. La sentencia GOTO desvía el flujo de ejecución a una determinada etiqueta. En PL/SQL las etiquetas se indican del siguiente modo: << etiqueta >>

Ejemplo1:

DECLARE FLAG NUMBER;BEGIN FLAG :=1 ; IF (FLAG = 1) THEN GOTO PASO2; END IF;

<<PASO1>> DBMS_OUTPUT.PUT_LINE('EJECUCION DE PASO 1');

<<PASO2>> DBMS_OUTPUT.PUT_LINE('EJECUCION DE PASO 2');END;/

Ejemplo2:

-- Encontramos el primer múltiplo de 13 mayor que 50DECLARE

v_num NUMBER(3);BEGIN FOR v_cont IN 50..100 LOOP

if MOD(v_cont,13) =0 thenv_num := v_cont;

dbms_output.new_line; GOTO bloque1;

End If; END LOOP; <<BLOQUE1>> dbms_output.put_line(' Primer múltiplo de 13 : ' || v_num);END;/

Page 6: Sesion07- Estructuras de control (Oracle)

Algunos problemas:

Problema1: programa actualiza la comisión de un empleado. El programa debe recibir el código del empleado, a ese empleado le deben asignar como comisión el 5% de toda las ventas que ha realizado. SQL>DECLARE V_EMPNO EMP.EMPNO%TYPE:=7900; V_TOTAL NUMBER(10,2);BEGIN SELECT SUM(TOTAL) INTO V_TOTAL FROM ORD

WHERE EMPNO=V_EMPNO; UPDATE EMP SET COMM = V_TOTAL*0.05 WHERE EMPNO=V_EMPNO;END;/

Problema2: Modifica el problema anterior sabiendo que si el total de ventas es menor a 3000 no asigno comisión, sin son entre 3000 y 5000 comisionas el 3%, si vendes más de 5000 es el 5%.

SQL>DECLARE V_EMPNO EMP.EMPNO%TYPE:=7900; V_TOTAL NUMBER(10,2); V_PORCENTAJE NUMBER(4,2);BEGIN SELECT SUM(TOTAL) INTO V_TOTAL

FROM ORD WHERE EMPNO=V_EMPNO;

IF V_TOTAL < 3000 THEN V_PORCENTAJE:=0; ELSIF V_TOTAL >= 3000 AND V_TOTAL <= 5000 THEN V_PORCENTAJE:=0.03; ELSE V_PORCENTAJE:=0.05; END IF;

UPDATE EMP SET COMM = V_TOTAL*V_PORCENTAJE WHERE EMPNO=V_EMPNO;END;/

Page 7: Sesion07- Estructuras de control (Oracle)

Problema3: Imprimir el calendarios del mes de marzo del 2012.

SQL>DECLARE

V_FECHA DATE:=TRUNC(SYSDATE,'MM');BEGIN

WHILE V_FECHA <= LAST_DAY(SYSDATE) LOOPDBMS_OUTPUT.PUT_LINE(TO_CHAR(V_FECHA,'DAY DD MONTH YYYY'));V_FECHA:=V_FECHA + 1;

END LOOP;END;/

Problema4: Programa que reciba una cadena y que imprima la cadena invertía.

SQL>DECLARE V_CADENA VARCHAR2(50):='CIBERTEC'; V_REVERSA VARCHAR2(50); V_POSICION NUMBER(2);BEGIN V_POSICION:=LENGTH(V_CADENA); WHILE V_POSICION >=1 LOOP V_REVERSA:=V_REVERSA || SUBSTR(V_CADENA,V_POSICION,1);

V_POSICION := V_POSICION - 1; END LOOP;

DBMS_OUTPUT.PUT_LINE(V_REVERSA);

END;/