Vous êtes sur la page 1sur 27

Mas en PL/SQL: Estructuras de Control y SQL Empotrado

Copyright Oracle Corporation, 2008. All rights reserved.

Objetivos
Luego de completar esta leccin, usted debera estar capacitado para hacer lo siguiente:

Entender el uso de varias estructuras de control


de programacin en PL/SQL

Usar sentencias de toma de decisiones basado en


varias opciones

Trabajar con sentencias enlazadas para ejecutar


un conjunto de sentencias repetitivas.

Empotrar sentencias SQL dentro de un block


PL/SQL para que interacte con el servidor Oracle.

26-2

Copyright Oracle Corporation, 2008. All rights reserved.

Estructuras de Control
En un lenguaje procedural como PL/SQL, existen tres estructuras bsicas de control de programacin:

1. 2.

En una estructura secuencial, una serie de instrucciones son ejecutadas desde el inicio al fin en un orden lineal. La estructura de seleccin es tambien conocida como una estructura de decisin o una estructura IF. Envuelve condiciones con un resultado TRUE (verdadero) o FALSE (falso) En una estructura looping o de lazos, una serie de instrucciones es ejecutado repetidamente.

3.

26-3

Copyright Oracle Corporation, 2008. All rights reserved.

Estructuras de Control: SELECCION


Una simple sentencia IF
DECLARE v_dia VARCHAR2(10):= '&dia'; BEGIN IF (v_dia = 'Domingo') THEN DBMS_OUTPUT.PUT_LINE('Domingo es feriado!'); END IF; END; /

Enter value for dia: Domingo Domingo es feriado! PL/SQL procedure successfully completed.

26-4

Copyright Oracle Corporation, 2008. All rights reserved.

Sentencia IF ELSE END IF


SET SERVEROUTPUT ON DECLARE v_edad number(2):= '&edad'; BEGIN IF (v_edad >=18) THEN DBMS_OUTPUT.PUT_LINE('EDAD: '||v_edad ||'-ADULTO'); ELSE DBMS_OUTPUT.PUT_LINE('EDAD: '||v_edad ||'-MENOR'); END IF; END; Enter value for edad: 21 EDAD: 21-ADULTO PL/SQL procedure successfully completed. SQL> / Enter value for edad: 12 EDAD: 12-MENOR PL/SQL procedure successfully completed.

26-5

Copyright Oracle Corporation, 2008. All rights reserved.

Sentencia DECODE
SELECT Lname, Fname, DECODE(positionId, 1, Salary*1.2, 2, Salary*1.15, 3, Salary*1.05, Salary) "Salario Nuevo" FROM employee;

LNAME --------------Smith Houston Roberts McCall Dev Shaw Garner Chen

FNAME Salario Nuevo --------------- ------------John 349800 Larry 172500 Sandi 94875 Alex 69825 Derek 92000 Jinku 28175 Stanley 51750 Sunny 38500

26-6

Copyright Oracle Corporation, 2008. All rights reserved.

Sentencia ELSIF
DECLARE v_pos NUMBER(1):= &Posicion; BEGIN IF (v_pos=1) THEN DBMS_OUTPUT.PUT_LINE('20% incremento'); ELSIF v_pos=2 THEN DBMS_OUTPUT.PUT_LINE('15% incremento'); ELSIF v_pos=3 THEN DBMS_OUTPUT.PUT_LINE('10% incremento'); ELSIF v_pos=4 THEN DBMS_OUTPUT.PUT_LINE('5% incremento'); ELSE DBMS_OUTPUT.PUT_LINE('NO incremento'); END IF; END;
Enter value for posicion: 2 15% incremento PL/SQL procedure successfully completed.

26-7

Copyright Oracle Corporation, 2008. All rights reserved.

DECLARE n NUMBER(3):= &nota; calificacion CHAR; BEGIN IF n >= 90 AND n <= 100 THEN calificacion := 'A'; END IF; IF n >= 80 AND n <= 89 THEN calificacion := 'B'; END IF; IF n >= 70 AND n <= 79 THEN calificacion := 'C'; END IF; IF n >= 60 AND n <= 69 THEN calificacion := 'D'; END IF; IF n >= 0 AND n <= 59 THEN calificacion := 'F'; END IF; IF n < 0 AND n > 100 THEN calificacion := 'U'; END IF; DBMS_OUTPUT.PUT_LINE('Nota es ' || TO_CHAR(n)); DBMS_OUTPUT.PUT_LINE('Calificacin es ' || calificacion); END; Enter value for nota: 93 Nota es 93 Calificacin es A PL/SQL procedure successfully completed.

Simple IF con condiciones mltiples

26-8

Copyright Oracle Corporation, 2008. All rights reserved.

Sentencia ELSIF
DECLARE n NUMBER(3):= &nota; calificacion CHAR; BEGIN IF n >= 90 AND n <= 100 THEN calificacion := 'A'; ELSIF n >= 80 AND n <= 89 THEN calificacion := 'B'; ELSIF n >= 70 THEN calificacion := 'C'; ELSIF n >= 60 THEN calificacion := 'D'; ELSIF n >= 0 THEN calificacion := 'F'; ELSIF n < 0 AND n > 100 THEN calificacion := 'U'; END IF; DBMS_OUTPUT.PUT_LINE('Nota es ' || TO_CHAR(n)); DBMS_OUTPUT.PUT_LINE('Calificacin es ' || calificacion); END; Enter value for nota: 77 Nota es 77 Calificacin es C PL/SQL procedure successfully completed.

26-9

Copyright Oracle Corporation, 2008. All rights reserved.

Sentencia CASE
DECLARE /* Ejemplo de CASE */ v_num NUMBER:= &cualquier_num; v_residuo NUMBER; BEGIN v_residuo:= MOD(v_num, 2); CASE v_residuo WHEN 0 THEN DBMS_OUTPUT.PUT_LINE(v_num || ' es PAR'); ELSE DBMS_OUTPUT.PUT_LINE(v_num || ' es IMPAR'); END CASE; END;

Enter value for cualquier_num: 5 5 es IMPAR PL/SQL procedure successfully completed.

26-10

Copyright Oracle Corporation, 2008. All rights reserved.

Sentencia CASE buscado


DECLARE /* Ejemplo de CASE buscado */ v_num NUMBER:= &cualquier_num; BEGIN CASE WHEN MOD(v_num, 2) = 0 THEN DBMS_OUTPUT.PUT_LINE(v_num || ' es PAR'); ELSE DBMS_OUTPUT.PUT_LINE(v_num || ' es IMPAR'); END CASE; END;

Enter value for cualquier_num: 5 5 es IMPAR PL/SQL procedure successfully completed.

26-11

Copyright Oracle Corporation, 2008. All rights reserved.

DECLARE v_genero CHAR:= '&sexo'; v_edad NUMBER(2):= '&edad'; v_recargo NUMBER(3,2); BEGIN IF (v_genero = 'M' AND v_edad >= 25) THEN v_recargo:= 0.05; END IF; IF (v_genero = 'M' AND v_edad < 25) THEN v_recargo:= 0.10; END IF; IF (v_genero = 'F' AND v_edad >= 25) THEN v_recargo:= 0.03; END IF; IF (v_genero = 'F' AND v_edad < 25) THEN v_recargo:= 0.06; END IF; DBMS_OUTPUT.PUT_LINE('GENERO :'||v_genero); DBMS_OUTPUT.PUT_LINE('EDAD :'|| TO_CHAR(v_edad)); DBMS_OUTPUT.PUT_LINE('RECARGO :'|| TO_CHAR(v_recargo)); END; Enter value for sexo: F Enter value for edad: 18 GENERO :F EDAD :18 RECARGO :.06 PL/SQL procedure successfully completed.

IF anidado: IF simple con condiciones mltiples

26-12

Copyright Oracle Corporation, 2008. All rights reserved.

DECLARE v_genero CHAR:= '&sexo'; v_edad NUMBER(2):= '&edad'; v_recargo NUMBER(3,2); BEGIN IF (v_genero = 'M') THEN /* HOMBRE */ IF (v_edad >= 25) THEN v_recargo:= 0.05; ELSE v_recargo:= 0.10; END IF; ELSE /* MUJER */ IF (v_edad >= 25) THEN v_recargo:= 0.03; ELSE v_recargo:= 0.06; END IF; END IF; DBMS_OUTPUT.PUT_LINE('GENERO :'||v_genero); DBMS_OUTPUT.PUT_LINE('EDAD :'|| TO_CHAR(v_edad)); DBMS_OUTPUT.PUT_LINE('RECARGO :'|| TO_CHAR(v_recargo)); END; Enter value for sexo: F Enter value for edad: 18 GENERO :F EDAD :18 RECARGO :.06 PL/SQL procedure successfully completed.

Sentencia IF anidado

26-13

Copyright Oracle Corporation, 2008. All rights reserved.

Estructuras de Control: LOOPING (Bucle)


SET SERVEROUTPUT ON DECLARE v_conteo NUMBER(2); v_suma NUMBER(2):= 0; v_promedio NUMBER(3,1); BEGIN v_conteo:= 1; /* contador inicializado */ LOOP v_suma:= v_suma + v_conteo; v_conteo:= v_conteo + 1; /* contador incrementado */ EXIT WHEN v_conteo > 10; /* condicin */ END LOOP; v_promedio:= v_suma/(v_conteo -1); DBMS_OUTPUT.PUT_LINE('Promedio del 1 al 10 es ' ||TO_CHAR(v_promedio)); END;

Promedio del 1 al 10 es 5.5 PL/SQL procedure successfully completed.

26-14

Copyright Oracle Corporation, 2008. All rights reserved.

Contador Controlado por un Loop WHILE


SET SERVEROUTPUT ON DECLARE v_conteo NUMBER(2); v_suma NUMBER(2):= 0; v_promedio NUMBER(3,1); BEGIN v_conteo:= 1; /* contador inicializado */ WHILE v_conteo <= 10 LOOP /* condicin */ v_suma:= v_suma + v_conteo; v_conteo:= v_conteo + 1; /* contador incrementado */ END LOOP; v_promedio:= v_suma/(v_conteo -1); DBMS_OUTPUT.PUT_LINE('Promedio del 1 al 10 es ' ||TO_CHAR(v_promedio)); END;

Promedio del 1 al 10 es 5.5 PL/SQL procedure successfully completed.

26-15

Copyright Oracle Corporation, 2008. All rights reserved.

Loop FOR
DECLARE v_conteo NUMBER(2); v_suma NUMBER(2):= 0; v_promedio NUMBER(3,1); BEGIN FOR v_conteo IN 1..10 LOOP v_suma:= v_suma + v_conteo; END LOOP; v_promedio:= v_suma/10; DBMS_OUTPUT.PUT_LINE('Promedio del 1 al 10 es ' ||TO_CHAR(v_promedio)); END;

Promedio del 1 al 10 es 5.5 PL/SQL procedure successfully completed.

26-16

Copyright Oracle Corporation, 2008. All rights reserved.

SQL dentro de PL/SQL


DECLARE v_apellido employee.Lname%TYPE; v_nombre employee.Fname%TYPE; v_salario employee.Salary%TYPE; BEGIN SELECT Lname, Fname, Salary INTO v_apellido, v_nombre, v_salario FROM employee WHERE employeeId = 200; DBMS_OUTPUT.PUT_LINE ('Nombre empleado:'||v_nombre||' '||v_apellido); DBMS_OUTPUT.PUT_LINE ('Salario: '||TO_CHAR(v_salario)); END;

Nombre empleado:Jinku Shaw Salario: 24500 PL/SQL procedure successfully completed.

26-17

Copyright Oracle Corporation, 2008. All rights reserved.

Manipulacin de Datos en PL/SQL


Sentencia INSERT

BEGIN INSERT INTO employee (employeeId, Lname, Fname, Salary, DeptId) VALUES (employee_employeeId_seq.NEXTVAL, 'RAI', 'AISH', 90000, dept_deptId_seq.CURRVAL); COMMIT; END; PL/SQL procedure successfully completed. END;

26-18

Copyright Oracle Corporation, 2008. All rights reserved.

Sentencia DELETE

DECLARE v_deptId dept.deptId%TYPE BEGIN SELECT deptId INTO v_deptId FROM dept WHERE UPPER(deptname) = '&dept_nombre' DELETE FROM employee WHERE deptId = v_deptId; COMMIT; END;
Enter value for dept_nombre: IT PL/SQL procedure successfully completed.

26-19

Copyright Oracle Corporation, 2008. All rights reserved.

Sentencia UPDATE

DECLARE v_incremento NUMBER:= &Increm_decimal BEGIN UPDATE employee SET Salary = Salary * (1 + v_incremento) WHERE employeeId = &empleado_ID; COMMIT; END; Enter value for increm_decimal: 0.15 Enter value for empleado_ID: 545 PL/SQL procedure successfully completed.

26-20

Copyright Oracle Corporation, 2008. All rights reserved.

Modelo de Base de Datos


cd Data Model customer + + + + + + cus_code: int cus_lname: char cus_initial: char 1 cus_areacode: char cus_phone: char cus_balance: float inv oice genera + 0..* + inv_number: int cus_code: customer 1 inv_date: char contiene + 1..* + +

line inv_number: invoice line_number: int p_code: product line_units: float line_price: float 0..* encontrado_en

1 v endor + + + + + + v_code: int v_name: char v_contact: char v_areacode: char 1 v_phone: char v_state: char v_order: char + + suministra + 0..* + + + + product p_code: char p_descript: char p_indate: char p_qoh: int p_min: int p_price: float p_discount: float v_code: vendor

26-21

Copyright Oracle Corporation, 2008. All rights reserved.

Ejemplo de Block annimo


SELECT * FROM vendor;
VEND_NUMBER ----------21225 21226 21231 21344 22567 23119 24004 24288 25443 25501 25595 VEND_NAME ----------------------------------Bryson, Inc. SuperLoo, Inc. D E Supply Gomez Bros. Dome Supply Randsets Ltd. Brackman Bros. ORDVA, Inc. B K, Inc. Damal Supplies Rubicon Systems VEND_CONTACT --------------Smithson Flushing Singh Ortega Smith Anderson Browning Hakford Smith Smythe Orton VEN --615 904 615 615 901 901 615 615 904 615 904 VEND_PHO -------223-3234 215-8995 228-3245 889-2546 678-1419 678-3998 228-1410 898-1234 227-0093 890-3529 456-0092 VE -TN FL TN KY GA GA TN TN FL TN FL V Y N Y N N Y N Y N N Y

11 rows selected.

26-22

Copyright Oracle Corporation, 2008. All rights reserved.

Ejemplo de Block annimo


BEGIN INSERT INTO vendor VALUES (25678, 'Microsoft Corp. ','Bill Gates','765','546-8484','WA','N'); END; / PL/SQL procedure successfully completed. SET SERVEROUTPUT ON BEGIN INSERT INTO vendor VALUES (25772,'Clue Store','Issac Hayes','456','323-2009','VA','N'); DBMS_OUTPUT.PUT_LINE('Nuevo vendedor agregado!'); END; / Nuevo vendedor agregado! PL/SQL procedure successfully completed.

26-23

Copyright Oracle Corporation, 2008. All rights reserved.

Ejemplo de Block annimo


SELECT * FROM vendor; VEND_NUMBER VEND_NAME ----------- -----------------------------25678 Microsoft Corp. 25772 Clue Store 21225 Bryson, Inc. 21226 SuperLoo, Inc. 21231 D E Supply 21344 Gomez Bros. 22567 Dome Supply 23119 Randsets Ltd. 24004 Brackman Bros. 24288 ORDVA, Inc. 25443 B K, Inc. 25501 Damal Supplies 25595 Rubicon Systems 13 rows selected. VEND_CONTACT --------------Bill Gates Issac Hayes Smithson Flushing Singh Ortega Smith Anderson Browning Hakford Smith Smythe Orton VEN --765 456 615 904 615 615 901 901 615 615 904 615 904 VEND_PHO -------546-8484 323-2009 223-3234 215-8995 228-3245 889-2546 678-1419 678-3998 228-1410 898-1234 227-0093 890-3529 456-0092 VE -WA VA TN FL TN KY GA GA TN TN FL TN FL V N N Y N Y N N Y N Y N N Y

26-24

Copyright Oracle Corporation, 2008. All rights reserved.

Block Annimo con Variables y Lazos

26-25

Copyright Oracle Corporation, 2008. All rights reserved.

Ejemplo de Block annimo con Tablas


set serveroutput on size 1000000 DECLARE type tabla_estudiantes is table of estudiantes%rowtype index by binary_integer; e_tabla tabla_estudiantes; cursor e is select carnet, nombres, apellidos, email from estudiantes; e_reg e%rowtype; i binary integer; BEGIN i:= 1; for e_reg in e loop exit when e%notfound; e_tabla(i) := e_reg; i:= i + 1; end loop; for i in 1..e_tabla.count loop dbms_output.put_line( e_tabla( || i || ).apellido = || e_tabla(i).apellido); end loop; END; /
26-26 Copyright Oracle Corporation, 2008. All rights reserved.

BASES DE DATOS: Laboratorio09


Martes 03 de Noviembre del 2009

Al terminar el Laboratorio enve sus respuestas al e-mail: habantoc@upao.edu.pe Use el formato siguiente en su envio: BD-Lab09_Nombre_Apellido 1. Escriba un block PL/SQL para encontrar si un ao es un ao bisiesto. Un ao bisiesto es diisible por 4 pero no por 100, o es divisible por 400. Por ejemplo, 2000 y 2004 son aos bisiestos, pero 1900 y 2001 no son aos bisiestos. (Sugerencia: La funcin MOD(n,d) divide n por d y retorna el residuo entero de la operacin) 2. Escriba un block PL/SQL para imprimir a todos los nmeros impares entre 1 y 10 usando un loop bsico. 3. Use un loop FOR , imprima los valores 10 al 1 en orden inverso. 4. Cree una tabla llamado ITEM con una columna llamada ItemNum con el tipo de dato NUMBER. Escriba un programa PL/SQL para insertar valores del 1 al 5 para ItemNum 5. Ingreses un nmero con una variable d sustitucin, y luego imprima su tabla de multiplicacin usando un loop WHILE. 6. Ingrese un nmero de mes entre 1 y 12 y un ao de cuatro dgitos, e imprima el nmero de das, en aquel mes. Para Febrero (mes = 2), chequee por ao bisiesto para mostrar el nmero de das igual a 28 o 29. 7. Use un block PL/SQL para eliminar el nmero de tem 4 de la tabla ITEM creado en el laboratorio 4. 8. Escriba un block PL/SQL que pida al usuario un ID vlido de usuario. Recupere los nombres de los empleados, descripcin de su calificacin, salario y comisin. Imprima el nombre, calificacin, y la suma del salario y comisin 9. Usted fue a una tienda de videos y rent un DVD que es retornable en 3 das contado desde la fecha que se renta. Ingrese la fecha de renta, mes de la renta, ao de la renta. Calcule e imprima la fecha de retorno, mes de retorno, y ao de retorno. Poer ejemplo: Fecha de la Mes de la Ao de la Fecha de Mes de Ao de Renta Renta renta Retorno retorno Retorno 2 27 30 12 2 12 2003 2000 2003 5 1 2 12 3 1 2003 2000 2004

Vous aimerez peut-être aussi