Loading presentation...

Present Remotely

Send the link below via email or IM

Copy

Present to your audience

Start remote presentation

  • Invited audience members will follow you as you navigate and present
  • People invited to a presentation do not need a Prezi account
  • This link expires 10 minutes after you close the presentation
  • A maximum of 30 users can follow your presentation
  • Learn more about this feature in our knowledge base article

Do you really want to delete this prezi?

Neither you, nor the coeditors you shared it with will be able to recover it again.

DeleteCancel

Make your likes visible on Facebook?

Connect your Facebook account to Prezi and let your likes appear on your timeline.
You can change this under Settings & Account at any time.

No, thanks

Clase 5

No description
by

María Soledad Fernández

on 4 January 2013

Comments (0)

Please log in to add your comment.

Report abuse

Transcript of Clase 5

Introducción a Oracle PLSQL
Clase 5 Redisparando excepciones:
Es valido como parte del manejo de una excepción global en un sub-bloque re-dispararla para que también se procese en el bloque padre. Ejemplo:
DECLARE
excepcion_error EXCEPTION;
BEGIN
BEGIN
raise excepcion_error;
EXCEPTION
WHEN excepcion_error THEN
dbms_output.put_line('Exception error local');
raise; --REDISPARA LA ACTUAL EXCEPTION
END;
EXCEPTION
WHEN excepcion_error THEN
dbms_output.put_line('Exception error bloque padre');
END; Propagación de excepciones:
Consideremos el siguiente ejemplo:
DECLARE
excepcion_error EXCEPTION;
BEGIN
DECLARE
excepcion_error EXCEPTION;
BEGIN
raise excepcion_error;
END;
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001,'Error OTHERS');
END; Uso de RAISE_APPLICATION_ERROR:
Es un procedimiento que permite emitir mensajes de error definidos por el usuario.
Su forma de uso es:
RAISE_APPLICATION_ERROR(numero_error, mensaje[,{TRUE | FALSE}]);

Donde:
numero_error: es un numero negativo entre -20000 y -209999.
Mensaje: es un string de hasta 2048 bytes.
TRUE: el error es ubicado sobre la pila de previos errores. FALSE: es el default y el error reemplaza a previos errores. Alcance de las excepciones PLSQL:
Una versión correcta del ejemplo anterior:
<<bloque_principal>>
DECLARE
excepcion_error EXCEPTION;
BEGIN
DECLARE
excepcion_error EXCEPTION;
BEGIN
raise bloque_principal.excepcion_error;
END;
EXCEPTION
WHEN excepcion_error THEN
RAISE_APPLICATION_ERROR(-20001,'Error');
END; Alcance de las excepciones PLSQL:
No esta permitido declarar una excepcion dos veces en el mismo bloque. Lo puede hacer pero en diferentes bloques.
Una excepción es local en el bloque donde esta declarada y global para todos los sub-bloques
Si dentro de un sub-bloque re-declara una excepción global, la definición local prevalece.
Puede referenciar a una excepción global utilizando labels de la siguiente manera:
block_label.exception_name; Ejemplo de uso de excepciones de usuario, SQLCODE y SQLERRM:
DECLARE
exc_emp_sin_comision EXCEPTION;
CURSOR cur_emp IS SELECT * FROM employees;
BEGIN
FOR rec_emp IN cur_emp LOOP
BEGIN
IF NVL(rec_emp.commission_pct,0)= 0 THEN
RAISE exc_emp_sin_comision;
END IF;
EXCEPTION
WHEN exc_emp_sin_comision THEN
dbms_output.put_line(SQLCODE || ' El empleado ' || rec_emp.employee_id || ' no tiene comision asignada');
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001,SQLERRM);
END;
END LOOP;
END; Excepciones definidas por el usuario:
Si el bloque PLSQL se ejecuto sin errores SQLCODE devuelve 0 y SQLERRM devuelve el mensaje “ORA-00000: normal”.
El mensaje que devuelve SQLERRM no suupera los 512 caracteres
Dentro de un bloque PLSQL se puede pasar el numero de error a la función SQLERRM para conocer el mensaje de error asociado. Ejemplo:
BEGIN
dbms_output.put_line(sqlerrm(-60));
END; Ejemplo de uso de PRAGMA_INIT:
DECLARE
deadlock_exception EXCEPTION;
PRAGMA EXCEPTION_INIT(deadlock_exception, -60);
BEGIN
... -- alguna operación que causa el error ORA-00060
EXCEPTION
WHEN deadlock_exception THEN
--sentencias de manejo de error
END; Clases de excepciones
Named system exceptions: excepciones que han sido definidas por PL/SQL y que ocurren como resultado de un error PL/SQL o en el procesamiento con el RDBMS. Están declaradas en el paquete STANDARD de PL/SQL.
Named programmer-defined exceptions: excepciones que ocurren como resultado de errores en el código de la aplicación. El programador les dio un nombre declarándolas en la secciones de declaraciones de variables. Después el programador hace que se disparen explícitamente.
Unnamed system exceptions: excepciones que ocurren como resultado de un error PL/SQL o en el procesamiento con el RDBMS pero que no tienen un nombre predeterminado. Solo los errores mas comunes tiene un nombre predefinido, los otros tienen un código de error y se les puede asignar un nombre usando la sentencia especial PRAGMA EXCEPTION_INIT.
Unnamed programmer-defined exceptions: excepciones que son definidas por el programador y que ocurren en el servidor. En este caso el programador les provee de un código de error y de un mensaje. En el cliente se levantan por medio de la sentencia RAISE_APPLICATION_ERROR. Ejemplo manejo de excepciones:
DECLARE
v_comision employees.commission_pct%type;
BEGIN
SELECT 1000/trunc(commission_pct)
INTO v_comision
FROM employees
WHERE employee_id = 150;
EXCEPTION
WHEN ZERO_DIVIDE THEN
RAISE_APPLICATION_ERROR(-20001,'Error division por cero');
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001,'Error');
END; Estado de las transacciones y excepciones:
Cuando un programa sale con unhandled exception, PLSQL no hace rolback del trabajo hecho por el programa.
Para evitar inconvenientes es muy importante utilizar siempre WHEN OTHERS THEN y controlar el fin de la transacción si el programa sale por excepción con ROLLBACK o eventualmente COMMIT según corresponda a la lógica que se desea implementar. Manejo de excepciones:
Si una excepción es disparada en el momento de inicialización de un identificador dentro de la sección declarativa de un bloque, entonces la excepción debe ser manejada por el bloque padre, pues en estas circunstancias la excepción se propaga inmediatamente y no puede ser interceptada por el exception handler del mismo bloque.
Las excepciones disparadas por alguna sentencia ubicada en el exception handler de un bloque solo puede ser manejadas por el exception handler del bloque padre.
Solo una excepción a la vez puede estar activa en el exception handler de un bloque. S Propagación de excepciones:
En el ejemplo anterior al haber un WHEN OTHERS THEN en el bloque padre dispara el RAISE_APPLICATION_ERROR. Si no existiera ese exception handler en el bloque padre entonces devolvería:
ORA-06510: PL/SQL: unhandled user-defined exception Alcance de las excepciones PLSQL:
Porque el siguiente ejemplo da error?
DECLARE
excepcion_error EXCEPTION;
BEGIN
DECLARE
excepcion_error EXCEPTION;
BEGIN
raise excepcion_error;
END;
EXCEPTION
WHEN excepcion_error THEN
RAISE_APPLICATION_ERROR(-20001,'Error');
END; Excepciones definidas por el usuario:
Las excepciones de usuario deben ser definidas y ejecutadas explícitamente por la sentencia RAISE.
Existe la posibilidad de utilizar WHEN OTHERS THEN dentro del exception handler para todas aquellos errores que no se interceptan explícitamente.
Dentro del exception handler podemos utilizar las funciones:
SQLCODE: devuelve el numero de error Oracle.
SQLERRM: devuelve el mensaje de error. Listado de excepciones predefinidas (continuacion): Excepciones PLSQL predefinidas
PLSQL predefine algunos errores comunes como excepciones.
Las excepciones predefinidas estan globalmente disponibles dentro del paquete STANDARD.
Existe el PRAGMA EXCEPTION_INIT que permite asociar un nombre de excepción con un código de error ORA-XXXX. Ventajas del manejo de excepciones
Mejoran la legibilidad del código
Permiten aislar las rutinas de manejo de errores dentro de un exception handler.
Permite propagar excepciones lo que resulta en mayor flexibilidad a la hora de confirmar parcial o totalmente transacciones en función de los errores encontrados.
Permite manejar excepciones de cualquier punto del código en un exception handler en vez de chequear los errores en cada linea de código ejecutable.
Permite llamar a procedimientos, funciones o paquetes comunes de administración de errores cuando una excepción se dispara. Excepciones
Para manejar las excepciones disparadas se debe escribir un bloque de código denominado “exception handler”
Después que se ejecuta el código del exception handler el bloque actual finaliza su ejecución y prosigue con la siguiente sentencia del bloque padre. En caso que no haya mas sentencias luego del exception handler entonces finaliza el programa. Excepciones
Cuando un error ocurre Oracle para la normal ejecución y transfiere el control a la parte de manejo de excepciones del código PLSQL.
Las excepcione internas son disparadas automáticamente por el sistema en run time cuando se produce un error. Manejo de Excepciones Excepciones
Son warning o condiciones de error
Puede ser definidas por el usuario pero también existen algunas predefinidas
En el caso de las excepciones definidas por el usuario, las puede definir en la sección declarativa de cualquier bloque, subprograma o paquete. Manejo de Excepciones Temario
Conceptos Introductorios
Manejo de excepciones en PLSQL
Tipos de Excepciones
Excepciones predefinidas
Trapeo de excepciones predefinidas por Oracle
Trapeo de errores del servidor Oracle no definidas
Excepciones definidas por el usuario
Propagando Excepciones
Función RAISE_APPLICATION_ERROR Manejo de Excepciones Propagación de excepciones:
Cuando una excepción es disparada, si PLSQL no encuentra el exception handler en el actual bloque o subprograma entonces la excepción se propaga. De esta manera la excepción se reproduce a si misma en el bloque padre hasta que el exception handler es encontrado o no hay mas bloques padres para verificar. Si no se encontró el correspondiente exception handler para la excepción entonces PLSQL devuelve un error “unhandled exception” a menos que encuentre un WHEN OTHERS THEN en alguno de los bloques padres. se Listado de excepciones predefinidas:
Manejo de Excepciones Introduccion a Oracle y PLSQL
Full transcript