Continuemos viendo algunos detalles a tener en cuenta, relativos al uso de las excepciones.
- Cuando ejecutamos varias sentencias seguidas del mismo tipo y queremos capturar alguna posible excepción debida al tipo de sentencia, podemos encapsular cada sentencia en un bloque y manejar en cada bloque la excepción, o podemos utilizar una variable localizadora para saber qué sentencia ha sido la que ha lanzado la excepción (aunque de esta manera no podremos continuar por la siguiente sentencia).
DECLARE sentencia NUMBER := 0; BEGIN ... SELECT * FROM agentes ... sentencia := 1; SELECT * FROM familias ... sentencia := 2; SELECT * FROM oficinas ... ... EXCEPTION WHEN NO_DATA_FOUND THEN IF sentencia = 0 THEN RAISE agente_no_encontrado; ELSIF sentencia = 1 THEN RAISE familia_no_encontrada; ELSIF sentencia = 2 THEN RAISE oficina_no_encontrada; END IF; END;
/ - Si la excepción es capturada por un manejador de excepción apropiado, ésta es tratada y posteriormente el control es devuelto al bloque superior. Si la excepción no es capturada y no existe bloque superior, el control se devolverá al entorno. También puede darse que la excepción sea manejada en un bloque superior a falta de manejadores para ella en los bloques internos, la excepción se propaga de un bloque al superior y así hasta que sea manejada o no queden bloques superiores con lo que el control se devuelve al entorno. Una excepción también puede ser relanzada en un manejador. En la siguiente presentación puedes ver cómo se propagan diferentes excepciones entre diferentes bloques.
Propagación de excepciones en PL/SQL. (odp - 17,90 KB)