Pular para o conteúdo
Visualizando 4 posts - 1 até 4 (de 4 do total)
  • Autor
    Posts
  • #82054
    fozzy
    Participante

      Boa Tarde pessoal,

      Gostaria de saber uma coisa, existe a possibilidade de eu capturar o nome de uma tabela quando ocorrer um erro na execução de um sql dinamico ?

      Tenho o seguinte codigo:


      BEGIN
      EXECUTE IMEDIATE COMANDO_SQL;
      EXCEPTION
      WHEN OTHERS THEN
      TRATAMENTO;
      END

      Vamos supor que ocorra um erro de chave estrangeira na execução do comando, gostaria de obter o nome da chave estrangeira. Sei que posso obter isso efetuando uma verredura na mensagem de erro, mas a informação pode ser diferente dependendo da linguagem que está sendo usando no oracle. Alguem já fez isso ?

      Preciso disso para criar um relatorio para usuario final, com uma mensagem do tipo “Sua inclusão de registro na tabela XYZ gerou um erro por problemas no relacionamento com a tabela YXX através do relacionamento AA”

      #82055
      Anônimo

        será que isso ajuda ?
        gravar as mensagens de erro numa tabela.

        BEGIN
        EXECUTE IMEDIATE COMANDO_SQL;
        EXCEPTION
        WHEN OTHERS THEN
        err_code := SQLCODE;
        err_msg := substr(SQLERRM, 1, 200);

          INSERT INTO audit_table (error_number, error_message)
          VALUES (err_code, err_msg);
        

        END;

        #82056
        fozzy
        Participante

          Então, não ajuda pois os usuarios reclamam da mensagem do oracle, falam que é dificil de ser entendida ! Deste modo como você descreveu é o que está sendo feito atualmente.

          #82060
          Anônimo

            E se vc usasse o procedimento atual para capturar o nome da constraint (instr, substring…etc..etc…) e passasse esse nome para a seguinte query

            select a.TABLE_NAME tabela_filha, b.TABLE_NAME tabela_pai, a.CONSTRAINT_NAME
            from dba_constraints a,
            dba_constraints b
            where a.CONSTRAINT_NAME = ‘NOME_CONSTRAINT’
            and a.R_CONSTRAINT_NAME = b.CONSTRAINT_NAME

            usando o resultado dela, vc pode montar a mensagem mais amigável e exibí-la (raise application_error)

          Visualizando 4 posts - 1 até 4 (de 4 do total)
          • Você deve fazer login para responder a este tópico.