Pular para o conteúdo
Visualizando 5 posts - 1 até 5 (de 5 do total)
  • Autor
    Posts
  • #88616
    Roldao
    Participante

      Olá a todos, Galera fiz um cursor basico do basico que segue abaixo, só para demonstração

      declare

      cursor c_visualizar is
      select a.nome_mercado,c.nome_produto,c.genero
      from tb_mercado a,
      tb_produto_mercado b,
      tb_produto c
      where a.id_mercado = b.id_mercado
      and c.id_produto = b.id_produto

      order by nome_mercado;

      v_linha c_visualizar%rowtype;

      begin

      open c_visualizar;

      loop
      fetch c_visualizar into v_linha;
      exit when c_visualizar%notfound;

      dbms_output.put_line(”);
      dbms_output.put_line (‘Mercado: ‘ || v_linha.nome_mercado);
      dbms_output.put_line (‘Produto: ‘ || v_linha.nome_produto);
      dbms_output.put_line (‘Genero: ‘ || v_linha.genero);

      end loop;

      close c_visualizar;
      end;

      MINHA DUVIDA SÃO OS EXCEPTION, POIS CONHECE SÓ

      WHEN DATA_FOUND THEN
      RAISE_APPLICATION_ERROR (-20001,’mENSAGEM’||SQLERRM);

      E

      WHEN OTHERS THEN

      RAISE_APPLICATION_ERROR (-20001,’mENSAGEM’||SQLERRM);

      GOSTARIA QUE ME EXPLICASSE SOBRE OS TRATAMENTOS DE ERRO, ESTOU COM MUITAS DÚVIDAS, E GOSTARIA DE TRABALHAR EM CIMA DELES.

      gRATO

      #88621
      jspaulonci
      Participante

        Roldao, dá uma olhada nesse site, tem alguns exemplos de exceptions

        http://www.psoug.org/reference/exception_handling.html

        abraços
        spaulonci

        #88622
        ramasine
        Participante

          Amigo,

          Toda exceção do oracle vem acompanhada do código do erro, no formato ORA-12345, existem muitos erros que podem ser levantados pelo Oracle, e portanto, como vc não irá fazer tratamento para todos eles é sempre bom ter uma cláusula “WHEN OTHERS THEN” no seu tratamento de exceção.

          O Oracle também já disponibiliza algumas exceções pré-definidas que são as que comumente acontecem e vc pode utilizá-las para fazer um tratamento específico enviando uma mensagem mais amigável ao usuário, um exemplo delas seria NO_DATA_FOUND,DUP_VAL_ON_INDEX,
          TOO_MANY_ROWS entre outras. Um exemplo de utilização delas seria:

          begin
          –seu código
          exception
          when NO_DATA_FOUND then
          RAISE_APPLICATION_ERROR(-20000, ‘INFORMAÇÃO NÃO ENCONTRADA’);
          when others then
          –tratamento geral
          end;

          É sempre bom utilizar OTHERS como um tratamento geral para vc garantir que todas as exceções serão tratadas. Observe que no tratamento da exceção pré-definida NO_DATA_FOUND eu levantei uma exceção personalizada com a mensagem própria.

          Para personalizar ainda mais vc também pode utilizar a função
          PRAGMA_EXCEPTION_INIT que vc associa um SQLCODE (não é um ORACODE – ORA 12345) já existente à uma variável EXCEPTION. Para isso vou dar um exemplo:

          DECLARE
          E EXCEPTION;
          PRAGMA_EXCEPTION_INIT(E, -1031);
          –ASSOCIEI A VARIAVEL EXCEPTION AO SQLCODE -1031 CUJO ORACODE É
          –ORA-01031
          BEGIN
          –CÓDIGO
          EXCEPTION
          WHEN E THEN
          –FAÇA O SEU TRATAMENTO
          WHEN OTHERS THEN
          — TRATAMENTO GERAL
          END;

          Alem de associar variáveis EXCEPTION à SQLCODEs existentes vc pode também utilizar essas variáveis para criar exceções dentro do código:

          DECLARE
          E EXCEPTION;
          BEGIN
          IF (alguma condição pra levantar exceção – ex: regra de negocio não
          permitida) THEN
          RAISE E;
          END IF;
          EXCEPTION
          WHEN E THEN
          — FAÇA SEU TRATAMENTO
          WHEN OTHERS THEN

          -- TRATAMENTO GERAL
          

          END;

          Como podes ver, existem muitas formas de fazer esse tratamento personalizado. Para consultar os códigos de erros do oracle existem muitos sites, um deles é http://www.ora-code.com!!

          No link abaixo vc consegue ver a tabela de Predefined PL/SQL exceptions!

          http://www.ciin.com.br/danielaccorsi/wp … tsheet.jpg

          #88624
          Avatar photoLeonardo Litz
          Participante

            Olá Ronaldo,

            Existem varios tratamentos de erros no oracle.
            Existem por exemplo tratamentos pré determinados pelo oracle e outros que podemos determinar.

            Alguns pré determinados, os mais comuns:

            NO_DATA_FOUND -> quando não se encontra um dado, ou select não retorna ou um array não contem dado.
            TOO_MANY_ROWS -> um select retorna mais que uma linha.
            DUP_VAL_ON_INDEX -> quando em um insert ou update ocorre restrição de chave primaria.
            INVALID_NUMBER -> quando não é um número valido, esta tentando inserir um caracter em uma variavel/coluna numerica.
            ZERO_DIVIDE -> quando algum número esta sendo dividido por zero.
            COLLECTION_IS_NULL -> quando alguma coleção esta nula.

            Dentre outros.

            Você também pode determinar os erros da seguinte forma, por exemplo:

            Quero que se ocorrer um erro, onde o pai de um registro não existir, mostre uma mensagem:

            Crie as tabelas.


            create table teste1 (id_teste1 number(2) primary key);
            create table teste2 (id_teste2 number(2) primary key,
            id_teste1 number(2));

            alter table teste2 add constraint fk_teste1 foreign key (id_teste1) references teste1(id_teste1);

            Execute o script de teste.

            declare

            parent_key_not_found exception;
            pragma exception_init(parent_key_not_found,-02291);

            begin

            insert into teste2(id_teste2,id_teste1) values (1,1);

            exception when parent_key_not_found then

            dbms_output.put_line('Erro de chave estrangeira!');

            end;

            Desta forma você pode montar vários excepitons customizados.

            Vlw Leonardo Litz

            #88686
            Roldao
            Participante

              Valew Galera, Obrigado mesmo..

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