Oracle - diferencia entre RAISE Y tomador de excepciones

 
Vista:

diferencia entre RAISE Y tomador de excepciones

Publicado por vaninana (3 intervenciones) el 11/09/2003 20:02:30
hola a todos, aca les mando un codigo que hice, el problema que tengo es que no veo la diferencia entre levantar un error con el RAISE_APPLICATION_ERROR y cuano tengo que definir una excepcion que lo levante. puede ser que en el primer caso si tengo u error se propaga y en el segundo caso no??
CREATE OR REPLACE FUNCTION get_service_yrs (p_empid IN employees.employee_id%TYPE)
RETURN NUMBER
IS
v_fecha job_history.start_date%TYPE;
v_years NUMBER;
--v_fecha1 job_history.start_date%TYPE;
BEGIN
SELECT MIN(start_date)
INTO v_fecha
FROM job_history
WHERE employee_id=p_empid;

/*SELECT hire_date
INTO v_fecha1
FROM employees
WHERE employee_id=p_empid;*/
v_years:= nvl(TRUNC((sysdate - v_fecha)/ 365),0);-- + NVL( TRUNC((sysdate - v_fecha1)/ 365),0);
RETURN (v_years);

/*EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20000,'EMPLEADO INVALIDO');*/
END;
/
desde ya muchas gracias vanina
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:diferencia entre RAISE Y tomador de excepciones

Publicado por Byron (300 intervenciones) el 11/09/2003 23:10:09
El raise_application_error genera un error en tiempo de ejecucion como si fuese un ORA, pero, personalizado... es decir al cual tu le puedes añadir tu propia descripcion.

Imagina que deseas crear un procedimiento que haga una transferencia de fondos, el procedimiento recibe el monto que se desea transferir y dentro del proc debe haber una validacion que si el saldo es suficiente, entonces:

PROGRAMACION CON RAISE_EXCEPTION_ERROR
----proc----
if cta.saldo_actual < p_monto_trans then
raise_application_error(-20000,'Saldo insuficiente');
end if;
----end-proc----
No incluyo dentro de una seccion exception, y en forms seria:
----form----
begin
trans(:cta_origen,:cta_dest,:valor_trans);
exception when others then
Message(sqlerrm);
end if;
---end-form-----
PROGRAMACION CON EXCEPCIONES
----proc----
if cta.saldo_actual < p_monto_trans then
raise Saldo_insuf;
end if;
...
exception when saldo_insuf then
var_salida := 1; -- Aborto proceso por saldo insuf cod de error 1
return;
----end-proc----
y en forms seria:
----form----
trans(:cta_origen,:cta_dest,:valor_trans, var_err);
if var_err = 0 then
Message('Procesado con exito');
elsif var_err = 1 then
Message("Saldo insuficiente");
end if;
---end-form-----
En teoria cumplen funciones parecidas pero con raise_applicaction_error es la unica forma directa de enviar errores predefinidos desde un paquete/proc/func de la BD hacia una forma.

Saludos DTB
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar