Escolar Documentos
Profissional Documentos
Cultura Documentos
DATOS II
Base de
Datos II
Errores PL/SQL
Bloque Pl/SQL
INGENIERÍA
DE SOFTWARE
BASE DE
DATOS II
Agenda
●
Tipos de datos de PL/SQL.
●
La estructura de datos TABLE INDEX.
●
Manejo de Excepciones.
INGENIERÍA
DE SOFTWARE
BASE DE
DATOS II
INGENIERÍA
DE SOFTWARE
BASE DE
DATOS II
INGENIERÍA
DE SOFTWARE
BASE DE
DATOS II
Comentar el código
●
Prefije los comentarios con dos guiones ( -- ).
●
Coloque los comentarios multi-línea entre los símbolos /* y */.
●
Ejemplo:
DECLARE
DECLARE
...
...
v_sal
v_sal NUMBER
NUMBER (9,
(9, 22 );
);
BEGIN
BEGIN
/*
/* Calcula
Calcula el
el salario
salario anual
anual en
en base
base al
al salario
salario
mensual
mensual ingresado
ingresado por
por el
el usuario
usuario */*/
v_sal
v_sal :=
:= :g_monthly_sal
:g_monthly_sal ** 12;
12;
END;
END; ---- Este
Este es
es el
el final
final del
del bloque
bloque
INGENIERÍA
DE SOFTWARE
BASE DE
DATOS II
Tablas INDEX BY
●
Están compuestas por dos componentes:
− Llave primaria de tipo de datos
BINARY_INTEGER.
− Columna de tipo de dato escalar o registro.
− Puede crecer en tamaño de manera dinámica
porque no están restringidas.
INGENIERÍA
DE SOFTWARE
BASE DE
DATOS II
……
TYPE
TYPE ename_table_type
ename_table_type IS
IS TABLE
TABLE OF
OF
employees.last_name%TYPE
employees.last_name%TYPE
INDEX
INDEX BY
BY BINARY_INTEGER;
BINARY_INTEGER;
ename_table
ename_table ename_table_type;
ename_table_type;
……
INGENIERÍA
DE SOFTWARE
BASE DE
DATOS II
INGENIERÍA
DE SOFTWARE
BASE DE
DATOS II
INGENIERÍA
DE SOFTWARE
BASE DE
DATOS II
INGENIERÍA
DE SOFTWARE
BASE DE
BY SET
SET SERVEROUTPUT
SERVEROUTPUT ON
DECLARE
DECLARE
ON
TYPE
TYPE emp_table_type
emp_table_type IS IS TABLE
TABLE OF
OF
employees%ROWTYPE
employees%ROWTYPE
INDEX
INDEX BYBY BINARY_INTEGER;
BINARY_INTEGER;
my_emp_table
my_emp_table emp_table_type;
emp_table_type;
v_count
v_count NUMBER(3)
NUMBER(3) := := 104;
104;
BEGIN
BEGIN
FOR
FOR ii IN
IN 100..v_count
100..v_count
LOOP
LOOP
SELECT
SELECT ** INTO
INTO my_emp_table(i)
my_emp_table(i) FROM
FROM employees
employees
WHERE
WHERE employee_id
employee_id == i; i;
END
END LOOP;
LOOP;
FOR
FOR ii IN
IN my_emp_table.FIRST..my_emp_table.LAST
my_emp_table.FIRST..my_emp_table.LAST
LOOP
LOOP
DBMS_OUTPUT.PUT_LINE(my_emp_table(i).last_name);
DBMS_OUTPUT.PUT_LINE(my_emp_table(i).last_name);
END
END LOOP;
LOOP;
END;
END;
INGENIERÍA
DE SOFTWARE
BASE DE
DATOS II
Manejo de errores
●
Una condición de error se denomina excepción
(exception).
●
Puede ser definida Internamente (por el
sistema en tiempo de ejecución) ó por el
usuario.
●
Ejemplos:
−ZERO_DIVIDE: ORA-22056 (value string is divided
by zero).
−STORAGE_ERROR: ORA-27102 (out of memory).
INGENIERÍA
DE SOFTWARE
BASE DE
DATOS II
Manejo de errores
●
Puede definir excepciones personalizadas
(user exceptions) asociadas a un identificador,
en un bloque PL/SQL, subprograma o paquete.
●
Ejemplo:
−insufficient_funds:
excepción para indicar una
cuenta bancaria sobregirada.
INGENIERÍA
DE SOFTWARE
BASE DE
DATOS II
Manejo de errores
●
Las excepciones personalizadas deben
provocarse explícitamente con:
−La sentencia RAISE
−Invocando al procedimiento
DBMS_STANDARD.RAISE_APPLICATION_ERROR.
INGENIERÍA
DE SOFTWARE
BASE DE
DATOS II
Manejo de errores
●
Para manejar excepciones, se escribe rutinas
separadas denominadas exception handlers.
●
Luego de ejecutar un exception handler, se
detiene la ejecución del bloque actual y el bloque
superior continúa con la siguiente sentencia.
●
Si no hay bloque superior, el control retorna al
entorno host.
INGENIERÍA
DE SOFTWARE
BASE DE
DATOS II
de error
●
Para manejar condiciones de error
(normalmente mensajes ORA-n) que no tienen
nombre predefinido, debe usar el manejador
OTHERS o el pragma EXCEPTION_INIT.
●
Pragma es una directiva para el compilador que
se procesa en tiempo de compilación, no en
tiempo de ejecución.
PRAGMA
PRAGMA EXCEPTION_INIT(exception_name,
EXCEPTION_INIT(exception_name,
-Oracle_error_number);
-Oracle_error_number);
INGENIERÍA
DE SOFTWARE
BASE DE
DATOS II
INGENIERÍA
DE SOFTWARE
BASE DE
personalizados
●
Con RAISE_APPLICATION_ERROR puede
producir mensajes ORA-n personalizados.
raise_application_error(error_number,
raise_application_error(error_number,
● message[,
RAISE_APPLICATION_ERROR es parte del
message[,
{TRUE
{TRUE || FALSE}]);
FALSE}]);
paquete DBMS_STANDARD, cuyos métodos
no requieren especificar nombre de paquete.
INGENIERÍA
DE SOFTWARE
BASE DE
personalizados
●
error_number: entero negativo en el rango
-20000..-20999.
●
Message: cadena de caracteres de hasta 2048
bytes.
●
Tercer parámetro (opcional):
−TRUE, error colocado en la pila de errores
anteriores.
−FALSE (por defecto), error reemplaza los errores
anteriores.
INGENIERÍA
DE SOFTWARE
BASE DE
DATOS II
Uso de RAISE_APPLICATION_ERROR
DECLARE
DECLARE
num_tables
num_tables NUMBER;
NUMBER;
BEGIN
BEGIN
SELECT
SELECT COUNT(*)
COUNT(*) INTO
INTO num_tables
num_tables FROM
FROM USER_TABLES;
USER_TABLES;
IF
IF num_tables
num_tables << 1000
1000 THEN
THEN
/*
/* Issue
Issue your
your own
own error
error code
code (ORA-20101)
(ORA-20101)
with
with your
your own
own error
error message.
message. You
You need
need not
not
qualify
qualify RAISE_APPLICATION_ERROR
RAISE_APPLICATION_ERROR with with
DBMS_STANDARD
DBMS_STANDARD */ */
RAISE_APPLICATION_ERROR
RAISE_APPLICATION_ERROR
(-20101,
(-20101, 'Expecting
'Expecting at at least
least 1000
1000 tables');
tables');
ELSE
ELSE
--
-- Do
Do rest
rest of
of processing
processing (for
(for nonerror
nonerror case)
case)
NULL;
NULL;
END
END IF;
IF;
END;
END;
//
INGENIERÍA
DE SOFTWARE
BASE DE
DATOS II
Resumen
●
Los tipos de datos utilizados en PL/SQL.
●
El tipo de dato TABLE INDEX.
●
Manejo de errores en PL/SQL.
INGENIERÍA
DE SOFTWARE