[oracle_br] Re: como retornar a linha que apresentou erro?

2006-01-20 Por tôpico evandrobarbian

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?

2006-01-19 Por tôpico jlchiappa
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?

2006-01-19 Por tôpico jlchiappa
É 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?

2006-01-19 Por tôpico jlchiappa
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