Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Capturar mens. de error de excepciones no predefinidas

Estas en el tema de Capturar mens. de error de excepciones no predefinidas en el foro de Oracle en Foros del Web. Hola. Estoy haciendo un procedimiento que guarde en un fichero un registro de las sentencias que se ejecutan en una base de datos. Ahora estoy ...
  #1 (permalink)  
Antiguo 14/10/2010, 09:42
 
Fecha de Ingreso: marzo-2005
Mensajes: 189
Antigüedad: 19 años, 1 mes
Puntos: 0
Capturar mens. de error de excepciones no predefinidas

Hola.

Estoy haciendo un procedimiento que guarde en un fichero un registro de las sentencias que se ejecutan en una base de datos.
Ahora estoy en la parte en que intento capturar el mensaje de error en caso de fallo para que quede reflejado en el fichero y me estoy encontrando con el problema de que a no ser que se produzca una excepción predefinida de Oracle, la funcion sqlerrm y sqlcode no me capturan el error. Pongo un ejemplo:

En este caso, si me captura el error. entiendo que el WHEN OTHERS lo interpreta como un WHEN ZERO_DIVIDE y me lo muestra en el OUTPUT.

begin
declare
error1 varchar(199);
error2 varchar(199);
variable NUMBER;
begin
SELECT 1/0 INTO variable FROM DUAL;
exception
when OTHERS then
error1 := sqlerrm;
error2 := to_char(sqlcode);
dbms_output.put_line(error1);
dbms_output.put_line(error2);
end;
end;


Al ejecutarlo me devuelve en el Output:
Error:-1476
ORA-01476: el divisor es igual a cero



Sin embargo, si provoco una excepción no predefinida, como intentar insertar en una tabla que no existe...

begin
declare
error1 varchar(199);
error2 varchar(199);
variable NUMBER;
begin
insert into KKFUTIS values ('kk');
exception
when OTHERS then
error1 := sqlerrm;
error2 := to_char(sqlcode);
dbms_output.put_line(error1);
dbms_output.put_line(error2);
end;
end;


En este caso, el editor me devuelve el error
PL/SQL: ORA-00942: la tabla o vista no existe
pero no consigo capturarlo en una variable para volcarlo al fichero y por lo tanto tampoco me aparece en el OUTPUT.

¿se le ocurre a alguien como podria hacerlo?

Muchas gracias de antemano.

Saludos

Última edición por Alextroy; 14/10/2010 a las 10:06
  #2 (permalink)  
Antiguo 15/10/2010, 02:38
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 16 años, 10 meses
Puntos: 43
Respuesta: Capturar mens. de error de excepciones no predefinidas

El problema es que no te está dando el error en tiempo de ejecución, te lo está dando en tiempo de "compilación".

Aunque sea un bloque anonimo, cuando le das a ejecutar, primero te "parsea" el SQL y si está correcto lo ejecuta, pero en el ejemplo que has puesto no está correcto el sql, ya que la tabla esa no existe y por lo tanto el bloque anonimo NO se ejecuta

Si tienes mas dudas, pregunta.
  #3 (permalink)  
Antiguo 15/10/2010, 04:13
 
Fecha de Ingreso: marzo-2005
Mensajes: 189
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Capturar mens. de error de excepciones no predefinidas

Ok, ya entiendo.

Ahora he hecho esta prueba:

CREATE TABLE KKFUTIS (CAMPO1 CHAR(10));

begin
declare
error1 varchar(199);
error2 varchar(199);
begin
INSERT INTO KKFUTIS (CAMPO1) VALUES ('ALGOMASGRANDEDE10');
exception
when OTHERS then
error1 := sqlerrm;
error2 := to_char(sqlcode);
dbms_output.put_line(error1);
dbms_output.put_line(error2);
end;
end;


En este caso el error sique aparece en tiempo de ejecucion ¿no?.
Cuando ejecuto el procedimiento, el editor no muestra error, simplemente no inserta el dato en la tabla. Lo que yo pretendo es capturar ese error ORA-01401 que deberia haberme aparecido en la variable error1 y error2.

He encontrado una forma que tal vez pueda valerme, te la comento a ver que te parece: Se trata de la directiva de compilación PRAGMA EXCEPTION_INIT:

PRAGMA EXCEPTION_INIT (nombre_excepcion, numero_excepcion_Oracle)

El problema que le veo es que en la declaración tienes que establecer todas las posibles excepciones que puedan ocurrir, por lo que hay muchas papeletas de que más de una se te escape...

Por cierto, este comando lo he encontrado en Oracle 10g, ¿existirá también en 9i?

Un saludo
  #4 (permalink)  
Antiguo 15/10/2010, 04:42
 
Fecha de Ingreso: marzo-2005
Mensajes: 189
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Capturar mens. de error de excepciones no predefinidas

Ok olvida las preguntas.

Lo he probado y creo que me va a valer.

Lo malo es eso, hay que preveer todas las posibles excepciones que puedan generarse, asique... ¡a trabajar!.

Un saludo y gracias por vuestro tiempo.
  #5 (permalink)  
Antiguo 15/10/2010, 05:17
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 16 años, 10 meses
Puntos: 43
Respuesta: Capturar mens. de error de excepciones no predefinidas

Eso si no recuerdo mal ya existia en la 7.3 .

No tienes que complicarte la vida, con que uses el WHEN OTHERS te vale. En cuanto haya algún castañazo se te va a ir por el when others y ahí ya capturas el sqlerrm.

Mira :

SQL> CREATE TABLE KKFUTIS (CAMPO1 CHAR(10));

Tabla creada.

SQL> set serveroutput on

SQL> begin
2 declare
3 error1 varchar(199);
4 error2 varchar(199);
5 begin
6 INSERT INTO KKFUTIS (CAMPO1) VALUES ('ALGOMASGRANDEDE10');
7 exception
8 when OTHERS then
9 error1 := sqlerrm;
10 error2 := to_char(sqlcode);
11 dbms_output.put_line(error1);
12 dbms_output.put_line(error2);
13 end;
14 end;
15
16 /

ORA-12899: value too large for column "user"."KKFUTIS"."CAMPO1" (actual: 17, maximum: 10)
-12899


Procedimiento PL/SQL terminado con éxito.


SQL> ed
Escrito fichero afiedt.buf

1 begin
2 declare
3 error1 varchar(199);
4 error2 varchar(199);
5 begin
6 INSERT INTO KKFUTIS (CAMPO1) VALUES (1/0);
7 exception
8 when OTHERS then
9 error1 := sqlerrm;
10 error2 := to_char(sqlcode);
11 dbms_output.put_line(error1);
12 dbms_output.put_line(error2);
13 end;
14* end;
15 /
ORA-01476: divisor is equal to zero
-1476

Procedimiento PL/SQL terminado con éxito.

SQL>
  #6 (permalink)  
Antiguo 15/10/2010, 05:30
 
Fecha de Ingreso: marzo-2005
Mensajes: 189
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Capturar mens. de error de excepciones no predefinidas

¡¡Joder pues tienes razón!!

No se como coño lo he probado yo antes que no me capturaba el error.
Y lo he hecho tal como he copiado en el primer post, osea igual que ahora...

Supongo que habrá sigo un lapsus de TOAD, tenia que haber caido antes en ello.

En fin, mañana perdida.

Gracias de nuevo.

Saludos

Etiquetas: excepciones
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:53.