Vous êtes sur la page 1sur 38

Implementacin y gestin

de base de datos

Prof. Luis Soto Soto


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;
Declaraciones Ejemplo 2
DECLARE
v_igv CONSTANT NUMBER(2,2) := 18/100;
c_dias_anho CONSTANT INTEGER := 365;
v_mes_actual CONSTANT VARCHAR2(12) :=
TO_CHAR(SYSDATE,'Month');
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;

END;

Vous aimerez peut-être aussi