[Dica] Exceptions

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
  

Mensagemem Ter, 22 Fev 2005 10:54 am

Alguma exceções pré-definidas, para o pessoal que gosta e tudo nos trinks!!!

Código: Selecionar todos
Exception                 ||  Error    ||  SQLCODE Value
-----------------------------------------------
ACCESS_INTO_NULL          || ORA-06530 || -6530
COLLECTION_IS_NULL        || ORA-06531 || -6531
CURSOR_ALREADY_OPEN       || ORA-06511 || -6511
DUP_VAL_ON_INDEX          || ORA-00001 || -1
INVALID_CURSOR            || ORA-01001 || -1001
INVALID_NUMBER            || ORA-01722 || -1722
LOGIN_DENIED              || ORA-01017 || -1017
NO_DATA_FOUND             || ORA-01403 || +100
NOT_LOGGED_ON             || ORA-01012 || -1012
PROGRAM_ERROR             || ORA-06501 || -6501
ROWTYPE_MISMATCH          || ORA-06504 || -6504
SELF_IS_NULL              || ORA-30625 || -30625
STORAGE_ERROR             || ORA-06500 || -6500
SUBSCRIPT_BEYOND_COUNT    || ORA-06533 || -6533
SUBSCRIPT_OUTSIDE_LIMIT   || ORA-06532 || -6532
SYS_INVALID_ROWID         || ORA-01410 || -1410
TIMEOUT_ON_RESOURCE       || ORA-00051 || -51
TOO_MANY_ROWS             || ORA-01422 || -1422
VALUE_ERROR               || ORA-06502 || -6502
ZERO_DIVIDE               || ORA-01476 || -1476


Essas exceções serão retornadas por todo e qualquer aplicativo que execute comando em uma Base de dados Oracle a descrição de todos os erros ORA ... são encontradas no Manual Errors8i da oracle que pode ser encontrado no endereço:

http://www.oracle.com/pls/db92/db92.err ... efill=ORA-

em ASP.NEt por exemplo poderíamos pegar essa mensagem em um Bloco :
Código: Selecionar todos
try
{
   objConn.Open(); 
   OracleDataReader objReader = objCmd.ExecuteReader();
   while (objReader.Read())
   {
      Response.Write(objReader.GetString(0) + "<br>");
   }
   objReader.Close();
}
catch( OracleException ex )
{
   Response.Write( ex.Message );
}
finally
{
   objConn.Close();
}



falou!!!

[]'s
MuLtAnI
Localização: Videira - SC

Mensagemem Sex, 21 Ago 2009 10:16 am

Pessoal..preciso fazer o tratamento de erros específicos..tipo:
Código: Selecionar todos
ORA-06502: PL/SQL: numeric or value error: character to number conversion error                                                               
ORA-06512: at "SIG.PRC_IMP_BASE_GENERICA", line 188                                                                                                 
ORA-00942: table or view does not exist 


E preciso gravar no log pelos procedimentos...conforme a estrutura abaixo:

Código: Selecionar todos
exception
  when vException then
    vRet:= sig.fnc_add_log('PRC_CARGA_FTO_ACCOUNT_SRV_NEW'
                          ,10
                          ,'E'
                          ,vLog
                          ,null
                          ,'Tabelas auxiliares de carga não encontradas'
                          ,vValor);
    if vRet = -1 then
       dbms_output.put_line('ERRO NO INSERT DO LOG');
    end if;                           
--    raise;
  when others then
    vMsg:= sqlerrm;
    vRet:= sig.fnc_add_log('PRC_CARGA_FTO_ACCOUNT_SRV_NEW'
                          ,10
                          ,'E'
                          ,vLog
                          ,null
                          ,vMsg
                          ,vValor);
    if vRet = -1 then
       dbms_output.put_line('ERRO NO INSERT DO LOG');
    end if;                         




Como posso fazer isso - pelos os erros específicos que citei acima e que não passam de vinte,imagino???
mariogus
Localização: Porto Alegre - RS

Mensagemem Sex, 21 Ago 2009 10:56 am

Beleza cara? Dá pra você definir seus próprios exceptions usando a diretriz de compilação PRAGMA EXCEPTION_INIT.
Você põe ela na seção DECLARE do seu bloco, mais ou menos assim:
Código: Selecionar todos
DECLARE
  v_teste number;
  conversao_numero EXCEPTION;
  PRAGMA EXCEPTION_INIT(conversao_numero, -06502);
BEGIN
   v_teste := to_number('A'); -- converter A para número vai dar erro!
EXCEPTION
  WHEN conversao_numero THEN
    dbms_output.put_line('Erro de conversao: ' || SQLERRM);
  WHEN OTHERS THEN
    dbms_output.put_line('Erro: ' || SQLERRM);
    raise; -- propaga, por exemplo, se não for nenhum dos erros esperados...
END;


É só você criar um exception para o código ORA-XXXXX que você quiser, e dá pra utilizar como se fosse as pré-definidas que tem no post acima.
Dá pra definir em package para reutilizar também em outros programas também e fica mais elegante o código, pois não precisa redefinir os exceptions em cada procedure que você fizer, é só reusar e alterar centralizado na package:

Código: Selecionar todos
create or replace PACKAGE erros_pack AS
  erro_conversao_numero EXCEPTION;
  PRAGMA EXCEPTION_INIT(erro_conversao_numero, -06502);
  erro_select_into EXCEPTION;
  PRAGMA EXCEPTION_INIT(erro_select_into, -01422);
END erros_pack;


e depois rodar o programa assim:

Código: Selecionar todos
DECLARE
  v_teste number;
BEGIN
   --v_teste := to_number('A'); -- converter A para número vai dar erro!
   select 1 into v_teste
    from dual
   union select 2 from dual; -- select into retorna duas linhas, vai dar erro!
EXCEPTION
  WHEN erros_pack.erro_select_into THEN
    dbms_output.put_line('Erro ORA' || SQLCODE || ': Select Into retornou mais de uma linha');
  WHEN erros_pack.erro_conversao_numero THEN
    dbms_output.put_line('Erro de conversao: ' || SQLERRM);
  WHEN OTHERS THEN
    dbms_output.put_line('Erro: ' || SQLERRM);
    raise; -- propaga, por exemplo, se não for nenhum dos erros esperados...
END;
fsitja
Localização: Gaúcho no Rio de Janeiro - RJ

"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist



Voltar para PL/SQL

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 5 visitantes

cron