Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tratamiento de Excepciones
Procedimientos almacenados
Funciones
Paquetes
Repaso General
17/11/2014
PL/SQL
3
Variables y tipos
Estructuras de control
Bucles y sentencias IFTHENELSE
Procedimientos y funciones
17/11/2014
PL/SQL
4
PL/SQL permite:
Manipular los datos de la BD
Manejar errores
Definidos por el usuario (excepciones)
Propios del sistema (predefinidos)
17/11/2014
PL/SQL (variables)
5
Interes NUMBER(5,3);
Fecha_max DATE;
17/11/2014
DECLARE
v_fecha DATE:='&fecha';
edad number:=&edad;
BEGIN
DBMS_OUTPUT.PUT_LINE('La fecha introducida
es: '||TO_CHAR(v_fecha));
dbms_output.put_line('Edad: '
||TO_NUMBER(edad));
END;
Curso de Oracle 10g 17/11/2014
DECLARE
/* Declaracin de uso local: variables, cursores,
excepciones de usuario, */
BEGIN
/* Seccin ejecutable (obligatoria): rdenes SQL y
procedimentales */
EXCEPTION
/* Zona de control de errores */
END;
Curso de Oracle 10g
17/11/2014
Tipos:
Condicionales (IF)
Bucles
Los bucles permiten repetir un nmero de veces un
conjunto de instrucciones PL/SQL.
Para romper el bucle se usa EXIT, GOTO o RAISE
Curso de Oracle 10g
17/11/2014
Ejemplo:
IF fecha_nac != 1-01-1970 THEN
IF apellido =Martnez THEN
salario:= salario *1.15;
END IF;
END IF;
Curso de Oracle 10g
17/11/2014
BUCLES
Bucles simples (LOOP).
Bucles condicionales (WHILE)
Bucles numricos (FOR)
17/11/2014
Sintaxis:
LOOP
-- Instrucciones
IF (expresion) THEN
-- Instrucciones
EXIT;
END IF;
END LOOP;
17/11/2014
SET SERVEROUTPUT ON
DECLARE
v_contador number:=1;
BEGIN
LOOP
dbms_output.put_line(v_contador);
v_contador:=v_contador+1;
EXIT WHEN v_contador>50;
END LOOP;
END;
Curso de Oracle 10g
17/11/2014
Sintaxis
WHILE condicin
LOOP
sentencias;
END LOOP;
17/11/2014
DECLARE
v_contador number:=1;
BEGIN
WHILE v_contador<=50 LOOP
dbms_output.put_line(v_contador);
v_contador:=v_contador+1;
END LOOP;
END;
Curso de Oracle 10g
17/11/2014
17/11/2014
DECLARE
numero number(2):=5;
producto number(2):=1;
BEGIN
FOR i in 1..10 LOOP
producto:= numero * i;
dbms_output.put_line(producto);
END LOOP;
END;
Curso de Oracle 10g
17/11/2014
PL/SQL (Cursores)
17
17/11/2014
17/11/2014
DECLARE
v_nombre varchar2(50);
BEGIN
select nombre into v_nombre
from alumno
where id_alumno=3;
dbms_output.put_line('estudiante '||v_nombre);
END;
17/11/2014
DECLARE
var1 alumno%rowtype;
BEGIN
select * into var1
from alumno
where ID_ALUMNO=1;
dbms_output.put_line('nombre: '||var1.nombre||' apellido:
'||var1.apellido);
END;
17/11/2014
17/11/2014
Con parmetros:
CURSOR <nombre_cursor> (param1 tipo1, param2 tipo2, ,
param n tipo n) IS <instruccin select>
17/11/2014
Con parmetros:
OPEN nombre_cursor (valor1, valor2, ., valor n);
17/11/2014
17/11/2014
17/11/2014
ATRIBUTOS DE LOS
CURSORES
26
DECLARE
CURSOR calumno IS
select * from alumno;
reg_alumno alumno%rowtype;
BEGIN
OPEN calumno;
LOOP
FETCH calumno INTO reg_alumno;
EXIT when calumno%notfound;
dbms_output.put_line(reg_alumno.nombre);
END LOOP;
CLOSE calumno;
END;
17/11/2014
17/11/2014
implcitamente
las
17/11/2014
30
DECLARE
CURSOR curalumno IS
select * from alumno;
reg_alumno alumno%rowtype;
BEGIN
FOR reg_alumno in curalumno
LOOP
dbms_output.put_line(reg_alumno.nombre);
END LOOP;
END;
Curso de Oracle 10g
17/11/2014
PL/SQL (Excepciones)
31
DECLARE
-- Declaraciones
BEGIN
-- Ejecucion
EXCEPTION
-- Excepcion
END;
Curso de Oracle 10g
17/11/2014
PL/SQL (Excepciones
predefinidas)
33
NO_DATA_FOUND, TOO_MANY_ROWS
DUP_VAL_ON_INDEX
17/11/2014
PL/SQL (Excepciones
predefinidas)
34
CURSOR_ALREADY_OPEN
INVALID_CURSOR
PROGRAM_ERROR, STORAGE_ERROR,
TIMEOUT_ON_RESOURCE
17/11/2014
PL/SQL (Excepciones
predefinidas)
35
DECLARE
-- Declaraciones
BEGIN
-- Ejecucion
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- Se ejecuta cuando ocurre una excepcion de tipo
NO_DATA_FOUND
WHEN ZERO_DIVIDE THEN
-- Se ejecuta cuando ocurre una excepcion de tipo ZERO_DIVIDE
WHEN OTHERS THEN
-- Se ejecuta cuando ocurre una excepcion de un tipo no tratado
-- en los bloques anteriores
END;
Curso de Oracle 10g
17/11/2014
Ejemplo
36
DECLARE
v_nombre varchar2(50);
BEGIN
select nombre into
v_nombre
from alumno;
bms_output.put_line('estudia
nte '||v_nombre);
END;
DECLARE
v_nombre varchar2(50);
BEGIN
select nombre into v_nombre
from alumno;
dbms_output.put_line('estudiante
'||v_nombre);
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('ERROR
SE HAN SELECCIONADO MAS DE UN
REGISTRADO');
END;
Curso de Oracle 10g
17/11/2014
Sintaxis
38
DECLARE
-- Declaraciones
MyExcepcion EXCEPTION;
BEGIN
-- Ejecucion
EXCEPTION
-- Excepcion
END;
Curso de Oracle 10g
17/11/2014
39
REGLAS DE ALCANCE
Una excepcin es vlida dentro de su mbito de alcance, es
decir el bloque o programa donde ha sido declarada. Las
excepciones predefinidas son siempre vlidas.
Como las variables, una excepcin declarada en un bloque es
local a ese bloque y global a todos los sub-bloques que
comprende.
LA SENTENCIA RAISE
La sentencia RAISE permite lanzar una excepcin en forma
explcita. Es posible utilizar esta sentencia en cualquier lugar
que se encuentre dentro del alcance de la excepcin.
Curso de Oracle 10g
17/11/2014
40
DECLARE
VALOR_NEGATIVO EXCEPTION;
valor NUMBER;
BEGIN
valor := -1;
IF valor < 0 THEN
RAISE VALOR_NEGATIVO;
END IF;
dbms_output.put_line(valor);
EXCEPTION
WHEN VALOR_NEGATIVO THEN
dbms_output.put_line('El valor no puede ser negativo');
END;
Curso de Oracle 10g
17/11/2014
Funciones SQLCode y
SQLErrm
41
17/11/2014
Funciones SQLCode y
SQLErrm
42
DECLARE
err_num NUMBER;
err_msg VARCHAR2(255);
result NUMBER;
BEGIN
SELECT 1/0 INTO result
FROM DUAL;
EXCEPTION
WHEN OTHERS THEN
err_num := SQLCODE;
err_msg := SQLERRM;
DBMS_OUTPUT.put_line('Error:'||TO_CHAR(err_num));
DBMS_OUTPUT.put_line(err_msg);
END;
17/11/2014
Funciones SQLCode y
SQLErrm
43
PRACTICA
44
1.
2.
3.
4.
17/11/2014
PL/SQL: Subprogramas
45
17/11/2014
Procedimientos almacenados
46
17/11/2014
Procedimientos almacenados:
Sintxis
47
17/11/2014
Procedimientos almacenados:
Ejemplo
48
17/11/2014
Procedimientos almacenados:
Ejemplo
49
17/11/2014
Ejecucin
50
Forma1:
SET
SERVEROUTPUT ON
BEGIN
ejemplo1;
END;
Forma 2:
EXEC ejemplo1;
17/11/2014
17/11/2014
BEGIN
insertar_alumno(5,'luis','guaman',9);
insertar_alumno(6,'pedro','perez',8);
END;
17/11/2014
PROCEDIMIENTOS ALMACENADOS
CON CURSORES IMPLICITOS
53
17/11/2014
PROCEDIMIENTOS ALMACENADOS
CON CURSORES IMPLICITOS Y
EXCEPCIONES
54
PROCEDIMIENTOS ALMACENADOS
CON CURSORES EXPICITOS
55
LOOP
FETCH c_listado INTO reg_alumno;
EXIT WHEN c_listado%NOTFOUND;
dbms_output.put_line('nombre: '||reg_alumno.nombre);
END LOOP;
CLOSE c_listado;
END;
END;
17/11/2014
FUNCIONES
56
17/11/2014
FUNCIONES: Sintaxis
57
17/11/2014
FUNCIONES: Ejemplo
58
17/11/2014
60
DECLARE
promedio number;
BEGIN
promedio:=fun_suma(5,5);
dbms_output.put_line('Promedio:
'||promedio);
END;
Curso de Oracle 10g 17/11/2014
61
DECLARE
promedio number;
BEGIN
select fun_suma(5,5) INTO promedio from
dual;
dbms_output.put_line('Promedio:
'||promedio);
Curso de Oracle 10g 17/11/2014
Ejemplo 2: Creacin
62
17/11/2014
Ejemplo 2: Ejecucin
63
select FUN_NOMBRE_ALUMNO(id_alumno)
from alumno;
17/11/2014
Ejercicios (1/2)
64
17/11/2014
Ejercicios (2/2)
65
17/11/2014
Pakages (Paquetes)
66
17/11/2014
Sintaxis
67
Sintaxis: Especificacin
68
Declaraciones de funciones
Declaraciones de procedimientos
END nombre_package;
Curso de Oracle 10g
17/11/2014
69
17/11/2014
70
END nombre_package;
Curso de Oracle 10g
17/11/2014
71
72
SET SERVEROUTPUT ON
DECLARE
r number;
BEGIN
r:=PKG_CALCULADORA.suma(2,3);
r:=PKG_CALCULADORA.resta(2,3);
END;
17/11/2014
Secuencias
73
17/11/2014
Sintaxis
74
17/11/2014
Ejemplo:
75
17/11/2014
Uso
76
17/11/2014
Clase Evaluativa
77
17/11/2014