[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
Responder
Avatar do usuário
MuLtAnI
Moderador
Moderador
Mensagens: 90
Registrado em: Ter, 01 Jun 2004 9:21 am
Localização: Videira - SC
Contato:

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

Selecionar tudo

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 :

Selecionar tudo

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
mariogus
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 157
Registrado em: Sex, 30 Nov 2007 1:17 pm
Localização: Porto Alegre - RS

Pessoal..preciso fazer o tratamento de erros específicos..tipo:

Selecionar tudo

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:

Selecionar tudo

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???
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
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

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:

Selecionar tudo

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-NNNNN 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:

Selecionar tudo

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:

Selecionar tudo

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;
Responder
  • Informação
  • Quem está online

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