Semana 8 PL/SQL Qu es PL/SQL? Lenguaje de programacin Desarrollado por Oracle Estructurado Extensin procedimental del lenguaje SQL Uso principal: crear subrutinas que implementan lgica de negocio para manejo de datos Bloques en PL/SQL Un bloque es la unidad bsica de programacin en PL/SQL Contiene secciones Un bloque puede contener otros bloques (bloques anidados) Un bloque PL/SQL puede ser: Annimo Nombrado Los bloques nombrados son de dos tipos: Procedimientos Funciones Estructura de un bloque annimo PL/SQL DECLARE <declaraciones> BEGIN Opcional <seccin ejecutable> EXCEPTION <manejo de errores> END; Seccin declarativa (aspectos bsicos) Seccin declarativa Sirve para declarar (o definir): Variables Constantes Otroselementos, como cursores, funciones, procedimientos y otros (ms adelante) Se ubica antes de la seccin ejecutable Declaraciones Ejemplo 1 DECLARE v_num_item NUMBER(6); v_desc_item VARCHAR2(20); v_precio_item NUMBER(6,2); v_fecha_corte DATE; v_hay_stock BOOLEAN := FALSE; BEGIN
END; Principales tipos de datos en PL/SQL CHAR VARCHAR2 NUMBER PLS_INTEGER DATE TIMESTAMP BOOLEAN Seccin ejecutable Seccin ejecutable Sirve para implementar la lgica de negocio requerida Elementos: Asignacin de valores a variables Llamadas a procedimientos y funciones Desarrollados por el usuario Suministrados por Oracle Sentencias SQL Sentencias condicionadas (IF THEN ELSE, CASE) Bucles (LOOP, FOR LOOP, WHILE LOOP) Sentencia NULL Asignacin de valores a variables Para asignar valores a variables se usa la sintaxis: variable := <expresin>; Las expresiones pueden incluir Variables y constantes PL/SQL Literales numricos, de caracteres, de fecha y lgicos Operadores aritmticos (+, -, *, /, **) Operador de concatenacin ( || ) Operadores lgicos (AND, OR, NOT, IS [NOT] NULL ) Valores de secuencias (CURRVAL, NEXTVAL) Funciones SQL, excepto DECODE y funciones de grupo Funciones PL/SQL Hello, World en PL/SQL BEGIN DBMS_OUTPUT.PUT_LINE('Hello, World'); END; SQL en PL/SQL SQL en PL/SQL PL/SQL puede ejecutar sentencias SQL: Estticas Dinmicas (ms adelante) Principales sentencias estticas vlidas SELECT INTO INSERT UPDATE DELETE COMMIT ROLLBACK Se puede usar expresiones PL/SQL en cualquier lugar donde se requiera un valor SELECT en PL/SQL SELECT INTO permite leer una o ms tablas y almacenar los resultados en variables PL/SQL La sentencia SELECT debe devolver exactamente UNA fila; de lo contrario, da un error (excepcin) Si se requiere procesar sentencias SELECT que devuelven ms de una fila, necesariamente se debe utilizar CURSORES (ms adelante) Ejemplo 1 SQL en PL/SQL DECLARE v_codigo NUMBER; v_nombre VARCHAR2(20); v_fecha_nac DATE; BEGIN
v_codigo := 100; v_nombre := 'Cecilia'; v_fecha_nac := DATE '1984-12-01'; INSERT INTO personas VALUES (v_codigo, v_nombre, v_fecha_nac); COMMIT;
END; Ejemplo 2 SQL en PL/SQL DECLARE v_codigo NUMBER := 100; v_nuevo_nombre VARCHAR2(20) := 'Rosario'; BEGIN
v_codigo := 200; UPDATE personas SET nombre = v_nuevo_nombre WHERE codigo = v_codigo; COMMIT;
END; Ejemplo 3 SQL en PL/SQL DECLARE v_codigo NUMBER := 100; v_nombre VARCHAR2(20); v_fecha_nac DATE; BEGIN
SELECT nombre, fecha_nac INTO v_nombre, v_fecha_nac FROM personas WHERE codigo = v_codigo;
END; Sentencias condicionadas Sentencias condicionadas Permiten ejecutar o dejar de ejecutar parte del cdigo dependiendo del valor de una condicin PL/SQL ofrece dos formas de trabajar con sentencias condicionadas: IF CASE Sentencia IF La sintaxis de la sentencia IF es la siguiente: IF <condicin 1> THEN <sentencias 1> ELSIF <condicin 2> THEN Opcional <sentencias 2>
ELSE <sentencias n> END IF; Ejemplo 1 IF DECLARE
BEGIN
IF v_codigo < 100 THEN DELETE FROM productos WHERE codigo = v_codigo; END IF;
END; Ejemplo 2 IF DECLARE
BEGIN
IF v_total_pedido > 1000 THEN aprobar_descuento; ELSE solicitar_descuento; END IF;
END; Ejemplo 3 IF DECLARE
BEGIN
IF v_total_pedido > 1000 THEN aprobar_descuento; ELSIF v_total_pedido > 500 THEN solicitar_descuento; ELSE denegar_descuento; END IF;
END; Ejemplo 4 IF DECLARE
BEGIN
IF v_total_pedido > 1000 THEN IF v_categoria = 'A' THEN aprobar_descuento; END IF; ELSE solicitar_descuento; END IF;
END; Sentencia CASE La sentencia CASE tiene dos formas: CASE simple CASE con bsqueda
La sintaxis es similar a las expresiones
CASE de SQL Ejemplo 1 CASE simple BEGIN
CASE v_nota WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE('Excelente'); WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE('Regular'); WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE('Malo'); ELSE DBMS_OUTPUT.PUT_LINE('Nota no es vlida'); END CASE;
END; Ejemplo 2 CASE con bsqueda BEGIN
CASE WHEN v_nota = 'A' THEN DBMS_OUTPUT.PUT_LINE('Excelente'); WHEN v_nota = 'B' THEN DBMS_OUTPUT.PUT_LINE('Regular'); WHEN v_nota = 'C' THEN DBMS_OUTPUT.PUT_LINE('Malo'); ELSE DBMS_OUTPUT.PUT_LINE('Nota no es vlida'); END CASE;
END; Bucles Bucles Permiten repetir un conjunto de sentencias hasta que se cumpla una condicin que detiene el bucle PL/SQL ofrece las siguientes opciones para trabajar con bucles: LOOP simple WHILE LOOP FOR LOOP Para controlar el funcionamiento de un bucle, se usan las sentencias: CONTINUE y CONTINUE WHEN (finalizan la iteracin actual) EXIT y EXIT WHEN (finalizan el bucle) Ejemplo 1 LOOP simple DECLARE
BEGIN
x := 1; LOOP INSERT INTO registro VALUES (x); x := x + 1; IF x > 100 THEN EXIT; END IF; END LOOP; COMMIT;
END; Ejemplo 2 LOOP simple DECLARE
BEGIN
x := 1; LOOP INSERT INTO registro VALUES (x); x := x + 1; EXIT WHEN x > 100; END LOOP; COMMIT;
END; Ejemplo 3 LOOP simple DECLARE
BEGIN
x := 0; LOOP x := x + 1; CONTINUE WHEN x = 50; INSERT INTO registro VALUES (x); EXIT WHEN x > 100; END LOOP; COMMIT;
END; Ejemplo 1 WHILE LOOP DECLARE
BEGIN
x := 1 WHILE x < 100 LOOP x := x + 1; CONTINUE WHEN x = 50; INSERT INTO registro VALUES (x); END LOOP; COMMIT;
END; Ejemplo 1 FOR LOOP DECLARE
BEGIN
FOR x IN 1..100 LOOP IF x = 50 THEN CONTINUE; END IF; INSERT INTO registro VALUES (x); END LOOP; COMMIT;
END; Ejemplo 2 FOR LOOP DECLARE
BEGIN
FOR x IN REVERSE 100..1 LOOP INSERT INTO registro VALUES (x); END LOOP; COMMIT;