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

Capturar excepción de PL-SQL

Estas en el tema de Capturar excepción de PL-SQL en el foro de Oracle en Foros del Web. Hola, para depurar un código, me gustaría capturar una excepción SQL (de otro modo, tendría que ir ejecutando una a una cada instrucción para ver ...
  #1 (permalink)  
Antiguo 04/06/2007, 10:08
 
Fecha de Ingreso: abril-2007
Mensajes: 160
Antigüedad: 17 años, 8 meses
Puntos: 1
Capturar excepción de PL-SQL

Hola, para depurar un código, me gustaría capturar una excepción SQL (de otro modo, tendría que ir ejecutando una a una cada instrucción para ver dónde falla). En sitios como éste:

santi.rastafurbi.org/oracle/plsql/node27.html

indican cómo capturarlas. Pero no dicen cómo mostrar la descripción de la excepción, tienes que escribirla tú (si estás con "others") o probar suerte capturando una excepción de las predefinidas.

¿No hay algún modo para capturar la excepción (que no sabes cuál es a priori) con su descripción, a modo de como se hace en ASP, .NET y otros lenguajes de programación?
  #2 (permalink)  
Antiguo 04/06/2007, 10:27
Avatar de kikolice  
Fecha de Ingreso: marzo-2004
Mensajes: 1.510
Antigüedad: 20 años, 9 meses
Puntos: 7
Re: Capturar excepción de PL-SQL

claro que se puede

exception when others then
--dependiendo de donde lo ejecutes depende de como realices la salida
--sqlerrm contiene el mensaje de error que regreso oracle
dbms_output.put_line ( sqlerrm );
end;
__________________
Blogzote.com :-) Mi blog
  #3 (permalink)  
Antiguo 05/06/2007, 02:09
 
Fecha de Ingreso: abril-2007
Mensajes: 160
Antigüedad: 17 años, 8 meses
Puntos: 1
Re: Capturar excepción de PL-SQL

¡Gracias! Lo probaré en cuanto pueda.
  #4 (permalink)  
Antiguo 05/06/2007, 05:10
 
Fecha de Ingreso: abril-2007
Mensajes: 160
Antigüedad: 17 años, 8 meses
Puntos: 1
Re: Capturar excepción de PL-SQL

Todavía no lo he podido probar, al no contar con el entorno de desarrollo adecuado. ¿Pero puede alguien ir adelantándome si sería correcto meter directamente el sqlerrm en un raise_application?

WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-1500, sqlerrm);

Gracias
  #5 (permalink)  
Antiguo 12/06/2007, 06:17
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Re: Capturar excepción de PL-SQL

Para eso no pongas el when others.

Y por otra parte el RAISE_APPLICATION_ERROR no funciona así. El numero tiene que estar en un rango ( del -20001 al no me acuerdo ) y el mensaje es un string que tienes que poner tu , por ejemplo
RAISE_APPLICATION_ERROR(-20001,'Operacion No Aceptada');

Y al hacer el raise, te saldrá algo parecido a esto :

ORA-20001 Operacion No Aceptada
  #6 (permalink)  
Antiguo 12/06/2007, 10:39
 
Fecha de Ingreso: abril-2007
Mensajes: 160
Antigüedad: 17 años, 8 meses
Puntos: 1
Re: Capturar excepción de PL-SQL

Bueno, sí, el -20000 creo que ya funciona (no conocía esa limitación en los números, pero estaba usando uno de los que entraban en el rango).

Pero precisamente yo quería el string sqlerrm para ver yo el error en desarrollo (otra forma habría sido con el dbms_output, cierto. Pero en determinados casos no lo tienes o no accedes a él, cuando es una aplicación la que ha llamado al procedimiento almacenado).

Por otro lado, no entiendo que digas que "para eso no pongas el when others", ¿por qué? ¿Quieres decir que ponga directamente el put_line sqlerrm y ya lo quite cuando haya visto el error?

Pues nada, gracias. Decir que ya lo probé, con el raise y sqlerrm, y me funcionó.
  #7 (permalink)  
Antiguo 12/06/2007, 11:25
 
Fecha de Ingreso: mayo-2003
Mensajes: 4
Antigüedad: 21 años, 7 meses
Puntos: 0
Re: Capturar excepción de PL-SQL

si me gustaria aprendret
  #8 (permalink)  
Antiguo 13/06/2007, 00:44
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Re: Capturar excepción de PL-SQL

Es que no entiendo que gestiones una excepcion para generar otra.
Si lo que quieres es ver el error, en el when others pones DBMS_OUTPUT.PUT_LINE (SQLERRM) y te sale el error y la descripcion. Si estás en una pantalla de forms, tienes que poner esto
message(sqlerrm);
message(sqlerrm);

Ponlo así para que te salga en una ventanita tipo alerta
  #9 (permalink)  
Antiguo 13/06/2007, 02:30
 
Fecha de Ingreso: abril-2007
Mensajes: 160
Antigüedad: 17 años, 8 meses
Puntos: 1
Re: Capturar excepción de PL-SQL

Ok, o sea que el when others sí que se utiliza.

Respecto a lo del "message", no sé qué es una pantalla de "forms", pero lo he probado por si acaso y no me ha funcionado (vamos, que no es una sentencia de Oracle). Como me imaginaba, te estarás refiriendo a otro programa externo (tipo ASP.NET).

Por cierto, ¿para subirle los datos de respuesta a una aplicación (por ejemplo .NET) hay que hacer algo especial? Si por ejemplo quieres devolver el resultado de un select.
  #10 (permalink)  
Antiguo 13/06/2007, 12:07
(Desactivado)
 
Fecha de Ingreso: junio-2007
Mensajes: 14
Antigüedad: 17 años, 6 meses
Puntos: 0
Re: Capturar excepción de PL-SQL

Capturar el when others es en general una mala practica, porque perdes el codigo de error oracle real, y el raise lanza una excepcion usando un codigo de error propio que no representa mucho. En general, es mas logico no capturarlo para que el error pueda ser atrapado por el proceso llamador.
  #11 (permalink)  
Antiguo 13/06/2007, 12:23
 
Fecha de Ingreso: abril-2007
Mensajes: 160
Antigüedad: 17 años, 8 meses
Puntos: 1
Re: Capturar excepción de PL-SQL

Ok, gracias! O sea que no ponemos control de excepciones dentro del PL, que ya las recibirá y controlará el script o quien fuera que lo llamara.
  #12 (permalink)  
Antiguo 13/06/2007, 12:30
(Desactivado)
 
Fecha de Ingreso: junio-2007
Mensajes: 14
Antigüedad: 17 años, 6 meses
Puntos: 0
Re: Capturar excepción de PL-SQL

Solo respecto al when others, las excepciones que requieren un tratamiento particular si se capturan.
  #13 (permalink)  
Antiguo 13/06/2007, 12:35
 
Fecha de Ingreso: abril-2007
Mensajes: 160
Antigüedad: 17 años, 8 meses
Puntos: 1
Re: Capturar excepción de PL-SQL

Ok.
  #14 (permalink)  
Antiguo 13/06/2007, 17:24
Avatar de kikolice  
Fecha de Ingreso: marzo-2004
Mensajes: 1.510
Antigüedad: 20 años, 9 meses
Puntos: 7
Re: Capturar excepción de PL-SQL

Cita:
Capturar el when others es en general una mala practica, porque perdes el codigo de error oracle real, y el raise lanza una excepcion usando un codigo de error propio que no representa mucho. En general, es mas logico no capturarlo para que el error pueda ser atrapado por el proceso llamador.
mala practica?? es la unica forma de controlar excepciones fuera de las predefinidas y la definidas por el usuario, yo diria que es totalmente lo contrario

el manejar el error por "proceso llamador" depende de donde y como estes implementando el pl en cuestion
__________________
Blogzote.com :-) Mi blog
  #15 (permalink)  
Antiguo 14/06/2007, 01:51
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Re: Capturar excepción de PL-SQL

kikolice tiene toda la razón.

Todo pl debe de llevar su gestion de excepciones y luego en base a eso y al cascotazo que dé, el programador ya debe de poner su propia logica para gestionarlo.
  #16 (permalink)  
Antiguo 14/06/2007, 08:41
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Re: Capturar excepción de PL-SQL

Hombre, no te pongas así.
Yo no tengo que leer ningún manual de pl, cosa que al parecer no has hecho tu y lo necesitas mas que un cocido. Hablas del copy paste con tal conocimiento de causa que me parece que es lo unico que sabes hacer, haciendo honor al nick que utilizas, aunque lo hayas recortado

¿ Ejemplos ?, no. No te voy a poner nada para que aprendas por la cara. Si quieres aprender me lo dices y te doy clases por un modico precio.

Pero mira, la primera clase te la doy gratis y me lo tienes que agradecer cuando te cambies de nick

Tu tienes tu maravilloso proceso de lo que sea, tienes gestionadas todas las excepciones excepto el when others ( que eso no va contigo )

Como eres tan sabio , el sabado noche salta tu proceso,funciona mal y está reventando la base de datos y se conecta el DBA y te lo calza.

Eso genera una excepción en tu maravillos Pl de la muerte ¿ cual ?, te lo digo yo .

WHEN DBA CALZA MY SESSION

De nada
  #17 (permalink)  
Antiguo 14/06/2007, 15:12
Avatar de kikolice  
Fecha de Ingreso: marzo-2004
Mensajes: 1.510
Antigüedad: 20 años, 9 meses
Puntos: 7
Re: Capturar excepción de PL-SQL

no voy a entrar a la discusion no me interesa, simplemente mantengo mi posicion con lo mencionado

analfa, aunque podrias dejar un procedure sin manejar excepciones fuera de las predefinidas ( when_no_data_found, when_dup_val_on_index, etc. ) y las predefinidas por el usuario con un raise, lo mejor es que el mismo procedure controle la salida de excepciones que podrian ocurrir en la ejecucion, aqui te dejo un ejemplo, en este caso es de un procedure que tiene una variable de salida: v_error

v_error out varchar2

EXCEPTION
WHEN NO_DATA_FOUND THEN
UTL_FILE.FCLOSE(fHandle);
WHEN OTHERS THEN
v_error := 'Linea:'||v_linea||'-'||sqlerrm;
UTL_FILE.FCLOSE(fHandle);
__________________
Blogzote.com :-) Mi blog
  #18 (permalink)  
Antiguo 14/06/2007, 16:15
Avatar de kikolice  
Fecha de Ingreso: marzo-2004
Mensajes: 1.510
Antigüedad: 20 años, 9 meses
Puntos: 7
Re: Capturar excepción de PL-SQL

"Estas asignando la responsabilidad al llamador de tener que evaluar la variable de salida para ver si funciono bien o no tu procedure"

el "llamador" evalua si funciono bien o no pero con un simple

if v_error is not null then
ocurrio un error en el procedure/paquete/etc; trono el proceso
end if;

el "llamador" no tiene que equivocarse con algo tan sencillo

si no existiera el when others el "llamador" tendria que evaluar el error, sencillo cuando hablas de un procedure/funcion/etc pero cuando hablas de un procedure que llama a otro procedure que llama a un paquete, etc. etc. tienes el control total de donde y quien mando el error

"los 'expertos' de oracle recomiendan esa practica, por la que te di y otras razones mas que serian largas de explicar."

yo no soy experto pero si lo pudieras respaldar por un link del "experto" con informacion al respecto en su caso no tendria problema en disculparme de lo dicho y de ahora en adelante desarrollar mis pls de esta forma
__________________
Blogzote.com :-) Mi blog
  #19 (permalink)  
Antiguo 15/06/2007, 01:23
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Re: Capturar excepción de PL-SQL

Cita:
Iniciado por analfa Ver Mensaje
Veo que tu capacidad no da ni para escribir 5 lineas de codigo, ni un misero ejemplo pudiste poner. Lo lamentable es que te pueda leer gente que quiera aprender y termine quedandose con tus ideas propias de alguien que recien empieza. Te reitero mi consejo, lee el manual de PL/SQL que no muerde !!!!!!
Y sino puedes escribir el ejemplo, busca alguno en internet y postealo !!!!!!

Ahhh, y por los terminos que usas para escribir ya me doy cuenta de donde eres, quedate tranquilo que la mayoria por alli es mediocre en todo lo que sea
programacion, he trabajado con muchos y es extremadamente dificil hacerles
entender como funcionan las cosas. No te culpo, esos mismos son los que te han enseñado de seguro.

Te recomiendo empezar con los manuales de oracle, los puedes descargar de la web oficial. ( estan en ingles, pero si quieres te busco algun manual en catellano, avisame, estoy a tu disposicion para guiarte en el aprendizaje)

Saludos y que disfrutes la lectura !!!!!!!
Je je je je je.

No hay peor ciego que el que no quiere ver, así que no voy a entrar en polemicas contigo. Tienes toda la razón, cuando programes no pongas ni un solo when others, que veras que bien te va a ir, te van a cascar los procesos y no vas a tener ni puñetera idea de donde te han cascado, pero te vendrá bien, eso es cierto, así aprendes.
¿ Manuales ?, no gracias, no los necesito, te los cedo a ti, que parece que eres experto en localizarlos, debe ser porque para ti son imprescindibles por aquello del copy-paste.
Y te remito a lo que te pone el compañero Kikolice, para procedures o funciones de los mas sencillito, eso de lo que debes ser tan experto ( insert into tal, delete from tal, etc etc etc ), no te hace falta poner nada, pero evoluciona un poco y quitate la venda e imaginate un proceso complejo de facturación, cierre mensual, etc etc, que son procedures que llaman a paquetes que llaman a funciones que llaman a mas paquetes, etc etc etc y son procesos complejos , costosos y largos. Aunque la 10g te gestiona muy bien esto, te puede saltar un ORA-01555 ( ¿ Sabes lo que es sin mirarlo en tus manuales ? ) ¿ como capturas eso ?, te lo digo yo :

WHEN PROCESO CASCA THEN
RELANZAR DE NUEVO A VER SI HAY SUERTE Y NO CASCA

De todas maneras todo esto que hemos escrito tiene su lado positivo, la gente ve las dos maneras que hay de hacer las cosas : La del copy-paste de los manuales y la de la experiencia. Así que cada cual saque sus propias conclusiones y programe según vea como es mejor para sus necesidades, que el cagarla es bueno, y un programador bueno la puede cagar 100 veces en 100 cosas distintas, pero si la caga 3 veces en lo mismo ya es un chapuzas y seguirá siendo un chapuzas el resto de su vida y creo que tu eres de estos ultimos

Y ya para terminar dices que estoy empezando, pues habrías acertado si me lo hubieras dicho en el año 1997, ya soy perro viejo en estas lides y mis tiempos de tirar código hace mucho tiempo que han pasado, aunque algunas veces lo hago para hechar una mano a alguien, no remitirle a los manuales de oracle que eso es muy facil,pero bueno esto no te interesa. Lo que si me gustaria es tropezarme un dia de estos contigo para que me dieras esas clases en persona.

Que tengas suerte Tio, la vas a necesitar programando así.

Y con esto doy por finiquitado esta diferencia de opiniones contigo, entro aquí para hechar una mano a la gente, no para ponerle la cara roja a nadie, así que si tienes un problema, pregunta sin miedo y trataré de ayudarte.

Un saludo
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 11:12.