[oracle_br] Re: como retornar a linha que apresentou erro?
No Oracle 10g existe na DBMS_UTILITY, o comando FORMAT_ERROR_BACKTRACE, que mostra exatamente o local onde aconteceu o erro. Basta acrescentar na exception: htp.p(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE); Att. Evandro Barbian -- Atenção! As mensagens deste grupo são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ --_ Area de download do grupo - http://www.4shared.com/dir/101727/a4dcc423 Links do Yahoo! Grupos * Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/oracle_br/ * Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] * O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html
[oracle_br] Re: como retornar a linha que apresentou erro?
Ah, agora tá mais claro, vc quer a linha DO PROGRAMA que tinha algum erro de programação, tá Negativo, o que o PL/SQL te dá é a linha onde o erro ACONTECEU (ORA-06512: em line 8 , linha 8 do programa no seu caso), mas ele NÂO faz uma análise lógica pra te dizer qual a linha CAUSADORA (a linha 2 no caso, onde a variável é declarada erradamente), isso não tem como no PL/SQL, que eu saiba. []s Chiappa --- Em oracle_br@yahoogrupos.com.br, Fabio Quirino [EMAIL PROTECTED] escreveu Realmente não me expressei direito, mas se notar no exemplo que expus, declarei uma variável como NUMBER e o campo da query que irá trazer o valor é um VARCHAR2, ou seja, são tipos diferentes. Mas enfim, trazer a linha que deu erro em qualquer situação, tentarei citar outro exemplo, rs... sem queries: 1 declare 2 num1 varchar2(1); 3 num2 number; 4 total number; 5 begin 6 num1 := 'a'; 7 num2 := 2; 8 total := num1 + num2; 9 dbms_output.put_line(total); 10* end; SQL / declare * ERRO na linha 1: ORA-06502: PL/SQL: error: erro de conversão de caractere em número numérico ou de valor ORA-06512: em line 8 jlchiappa [EMAIL PROTECTED] escreveu: Esse exemplo foi meio infeliz, pois um SELECT ** nunca ** vai dar erro numa linha só (a não ser em casos de queda da conexão com o banco, corrupt block, FGA com problemas, coisas eventuais e raras do tipo). Com um SELECT o que acontece é que OU ele não achou ninguém e deu no-data-found OU ele trouxe as linhas, imagino que o que vc quer é fazer um DML pra CADA LINHA retornada pelo SELECT, aí sim vai ser processado um comando pra cada linha, tem sentido se falar em linha do erro , tipo : declare v_codigo number; begin for r in (select nome, rowid rowid_da_tab from tabela where codigo = 1) loop -- Begin insert into tabela .. where codigo = r.nome; exception when others then dbms_output.put_line(sqlerrm || ' na linha ' || r.rowid_dat_tab); End; end loop; end; == Isso responde à pergunta em questão, mas fica o aviso, manipulações do tipo PREFERENCIALMENTE devem ser (pensando em performance) feitas em SQL diretamente, e vc captura as linhas com erros via tabela de exceptions, como mostrado em http://asktom.oracle.com/pls/ask/f? p=4950:8:F4950_P8_DISPLAYID:427428963, se for um erro coberto por constraints (como NULLs, PKs/UK violadas, FK sem pai, etc). []s Chiappa --- Em oracle_br@yahoogrupos.com.br, Fabio Quirino escreveu Galera, Existe algum jeito de tratar um determinado erro, porém, exibir a linha que deu um erro no momento da execução? declare v_codigo number; begin select nome into v_codigo from tabela where codigo = 1; exception when others then dbms_output.put_line(sqlerrm || ); end; Fabio Quirino MSN: [EMAIL PROTECTED] ICQ: 147482462 - Yahoo! doce lar. Faça do Yahoo! sua homepage. [As partes desta mensagem que não continham texto foram removidas] -- Atenção! As mensagens deste grupo são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ -- _ Area de download do grupo - http://www.4shared.com/dir/101727/a4dcc423 Links do Yahoo! Grupos Fabio Quirino MSN: [EMAIL PROTECTED] ICQ: 147482462 - Yahoo! doce lar. Faça do Yahoo! sua homepage. [As partes desta mensagem que não continham texto foram removidas] -- Atenção! As mensagens deste grupo são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ --_ Area de download do grupo - http://www.4shared.com/dir/101727/a4dcc423 Links do Yahoo! Grupos * Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/oracle_br/ * Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] * O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html
RES: [oracle_br] Re: como retornar a linha que apresentou erro?
É uma boa técnica, eu a uso também, mas com certeza ainda vale a ressalva que eu disse, ela ** não ** vai indicar a linha-causa do erro. No seu exemplo, se der erro no SELECT porque vData foi definida com um datatype errado, e portanto a causa reside numa OUTRA linha onde vData foi definida, vc só vai saber isso ANALIZANDO o programa, e é isso o que o colega lá queria []s Chiappa --- Em oracle_br@yahoogrupos.com.br, Ivan Ricardo Schuster [EMAIL PROTECTED] escreveu Em scripts muito grandes, costumo usar variáveis que guardam a etapa pela qual o programa passou. Ex: vEtapa:= 1; select sysdate into vData drom dual; vEtapa:= 2; if to_char(vData,'mi')=5 then vMinuto := 5; end if; vEtapa := 3; (...) Exception When others then Dbms_output.put_line('Erro na etapa '||vEtapa||': '||sqlerr); -Mensagem original- De: oracle_br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED] Em nome de jlchiappa Enviada em: quinta-feira, 19 de janeiro de 2006 09:59 Para: oracle_br@yahoogrupos.com.br Assunto: [oracle_br] Re: como retornar a linha que apresentou erro? Ah, agora tá mais claro, vc quer a linha DO PROGRAMA que tinha algum erro de programação, tá Negativo, o que o PL/SQL te dá é a linha onde o erro ACONTECEU (ORA-06512: em line 8 , linha 8 do programa no seu caso), mas ele NÂO faz uma análise lógica pra te dizer qual a linha CAUSADORA (a linha 2 no caso, onde a variável é declarada erradamente), isso não tem como no PL/SQL, que eu saiba. []s Chiappa --- Em oracle_br@yahoogrupos.com.br, Fabio Quirino [EMAIL PROTECTED] escreveu Realmente não me expressei direito, mas se notar no exemplo que expus, declarei uma variável como NUMBER e o campo da query que irá trazer o valor é um VARCHAR2, ou seja, são tipos diferentes. Mas enfim, trazer a linha que deu erro em qualquer situação, tentarei citar outro exemplo, rs... sem queries: 1 declare 2 num1 varchar2(1); 3 num2 number; 4 total number; 5 begin 6 num1 := 'a'; 7 num2 := 2; 8 total := num1 + num2; 9 dbms_output.put_line(total); 10* end; SQL / declare * ERRO na linha 1: ORA-06502: PL/SQL: error: erro de conversão de caractere em número numérico ou de valor ORA-06512: em line 8 jlchiappa [EMAIL PROTECTED] escreveu: Esse exemplo foi meio infeliz, pois um SELECT ** nunca ** vai dar erro numa linha só (a não ser em casos de queda da conexão com o banco, corrupt block, FGA com problemas, coisas eventuais e raras do tipo). Com um SELECT o que acontece é que OU ele não achou ninguém e deu no-data-found OU ele trouxe as linhas, imagino que o que vc quer é fazer um DML pra CADA LINHA retornada pelo SELECT, aí sim vai ser processado um comando pra cada linha, tem sentido se falar em linha do erro , tipo : declare v_codigo number; begin for r in (select nome, rowid rowid_da_tab from tabela where codigo = 1) loop -- Begin insert into tabela .. where codigo = r.nome; exception when others then dbms_output.put_line(sqlerrm || ' na linha ' || r.rowid_dat_tab); End; end loop; end; == Isso responde à pergunta em questão, mas fica o aviso, manipulações do tipo PREFERENCIALMENTE devem ser (pensando em performance) feitas em SQL diretamente, e vc captura as linhas com erros via tabela de exceptions, como mostrado em http://asktom.oracle.com/pls/ask/f? p=4950:8:F4950_P8_DISPLAYID:427428963, se for um erro coberto por constraints (como NULLs, PKs/UK violadas, FK sem pai, etc). []s Chiappa --- Em oracle_br@yahoogrupos.com.br, Fabio Quirino escreveu Galera, Existe algum jeito de tratar um determinado erro, porém, exibir a linha que deu um erro no momento da execução? declare v_codigo number; begin select nome into v_codigo from tabela where codigo = 1; exception when others then dbms_output.put_line(sqlerrm || ); end; Fabio Quirino MSN: [EMAIL PROTECTED] ICQ: 147482462 - Yahoo! doce lar. Faça do Yahoo! sua homepage. [As partes desta mensagem que não continham texto foram removidas] -- -- -- Atenção! As mensagens deste grupo são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ -- -- -- _ Area de download do grupo - http://www.4shared.com/dir/101727/a4dcc423 Links do Yahoo! Grupos
RES: [oracle_br] Re: como retornar a linha que apresentou erro?
Veja, na verdade o sqlplus não detecta coisa alguma, ele simplesmente exibe o stack de erros, que vc até pode capturar com DBMS_UTILITY.FORMAT_ERROR_STACK - em http://asktom.oracle.com/pls/ask/f?p=4950:8:F4950_P8_DISPLAYID:433029981484 vc tem um exemplo. Eu não uso nada disto, até porque há algumas restrições (na própria página citada isso é mostrado), penso q a técnica de vc indicar a posição do comando imho é mais simples e garantida, mas é isso. ´[]s Chiappa OBS :no 10g me parece que isso muda com a rotina DBMS_UTILITY.FORMAT_ERROR_BACKTRACE , mas não testei ainda. --- Em oracle_br@yahoogrupos.com.br, Fabio Quirino [EMAIL PROTECTED] escreveu ainda assim permanece a dúvida, como que o SQL plus consegue detectar a linha que apresentou erro? já ajudaria bastante se ao menos eu tivesse um retorno de onde o programa foi interrompido... uma mensagem idêntica à mensagem exibida no SQL-plus, ou seja, apontando onde deu o erro.. entretanto, quando uso o SQLERRM ele apenas apresenta o tipo do erro que ocorreu... jlchiappa [EMAIL PROTECTED] escreveu: É uma boa técnica, eu a uso também, mas com certeza ainda vale a ressalva que eu disse, ela ** não ** vai indicar a linha-causa do erro. No seu exemplo, se der erro no SELECT porque vData foi definida com um datatype errado, e portanto a causa reside numa OUTRA linha onde vData foi definida, vc só vai saber isso ANALIZANDO o programa, e é isso o que o colega lá queria []s Chiappa --- Em oracle_br@yahoogrupos.com.br, Ivan Ricardo Schuster escreveu Em scripts muito grandes, costumo usar variáveis que guardam a etapa pela qual o programa passou. Ex: vEtapa:= 1; select sysdate into vData drom dual; vEtapa:= 2; if to_char(vData,'mi')=5 then vMinuto := 5; end if; vEtapa := 3; (...) Exception When others then Dbms_output.put_line('Erro na etapa '||vEtapa||': '||sqlerr); -Mensagem original- De: oracle_br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED] Em nome de jlchiappa Enviada em: quinta-feira, 19 de janeiro de 2006 09:59 Para: oracle_br@yahoogrupos.com.br Assunto: [oracle_br] Re: como retornar a linha que apresentou erro? Ah, agora tá mais claro, vc quer a linha DO PROGRAMA que tinha algum erro de programação, tá Negativo, o que o PL/SQL te dá é a linha onde o erro ACONTECEU (ORA-06512: em line 8 , linha 8 do programa no seu caso), mas ele NÂO faz uma análise lógica pra te dizer qual a linha CAUSADORA (a linha 2 no caso, onde a variável é declarada erradamente), isso não tem como no PL/SQL, que eu saiba. []s Chiappa --- Em oracle_br@yahoogrupos.com.br, Fabio Quirino escreveu Realmente não me expressei direito, mas se notar no exemplo que expus, declarei uma variável como NUMBER e o campo da query que irá trazer o valor é um VARCHAR2, ou seja, são tipos diferentes. Mas enfim, trazer a linha que deu erro em qualquer situação, tentarei citar outro exemplo, rs... sem queries: 1 declare 2 num1 varchar2(1); 3 num2 number; 4 total number; 5 begin 6 num1 := 'a'; 7 num2 := 2; 8 total := num1 + num2; 9 dbms_output.put_line(total); 10* end; SQL / declare * ERRO na linha 1: ORA-06502: PL/SQL: error: erro de conversão de caractere em número numérico ou de valor ORA-06512: em line 8 jlchiappa escreveu: Esse exemplo foi meio infeliz, pois um SELECT ** nunca ** vai dar erro numa linha só (a não ser em casos de queda da conexão com o banco, corrupt block, FGA com problemas, coisas eventuais e raras do tipo). Com um SELECT o que acontece é que OU ele não achou ninguém e deu no-data-found OU ele trouxe as linhas, imagino que o que vc quer é fazer um DML pra CADA LINHA retornada pelo SELECT, aí sim vai ser processado um comando pra cada linha, tem sentido se falar em linha do erro , tipo : declare v_codigo number; begin for r in (select nome, rowid rowid_da_tab from tabela where codigo = 1) loop -- Begin insert into tabela .. where codigo = r.nome; exception when others then dbms_output.put_line(sqlerrm || ' na linha ' || r.rowid_dat_tab); End; end loop; end; == Isso responde à pergunta em questão, mas fica o aviso, manipulações do tipo PREFERENCIALMENTE devem ser (pensando em performance) feitas em SQL diretamente, e vc captura as linhas com erros via tabela de exceptions, como mostrado em http://asktom.oracle.com/pls/ask/f? p=4950:8:F4950_P8_DISPLAYID:427428963, se for um erro coberto por constraints (como NULLs, PKs/UK violadas, FK sem pai, etc). []s Chiappa --- Em oracle_br@yahoogrupos.com.br, Fabio Quirino escreveu Galera, Existe algum jeito de tratar um determinado erro, porém, exibir a linha que deu um erro no momento