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

      Gostaria de uma ajuda para criação de procedure em Oracle 10g
      Tenho duas tabelas (table1 e table2).Na table1 vou ter dados que vou jogar na table2 e caso o registro já esteja na table2,
      preciso fazer o update e se não, o insert. Como faço essa implementação no “if” e como faço a declaração da table2.
      Segue o que tenho montado…

      AS
      cod_erro NUMBER;
      message_erro VARCHAR2(255);
      CURSOR C1 IS
      SELECT emp, codigo, descricao FROM table1 FOR UPDATE;
      REGISTRO C1%ROWTYPE;

      BEGIN

      OPEN C1;
      LOOP
      FETCH C1 INTO REGISTRO;
      EXIT WHEN C1%NOTFOUND;
      if ??????? (se o table1.emp=table2.emp então fazer o update, se não o insert)
      then
      update table2 set cod=REGISTRO.cod,descricao=REGISTRO.descricao) ;
      else
      insert into table2 (emp, codigo, descricao) values (REGISTRO.emp,REGISTRO.cod,REGISTRO.descricao);
      end if;
      END LOOP;
      EXCEPTION
      WHEN OTHERS THEN
      cod_erro := SQLCODE;
      message_erro := SQLERRM;
      INSERT INTO CARLOS.ERROS_IMPORT
      VALUES (cod_erro, message_erro, sysdate);
      update table1 set date=SYSDATE where CURRENT OF c1;
      CLOSE C1 ;
      END;

      obrigado

      Carlos

      #80587
      Marcio68Almeida
      Participante

        O jeito mais simples que encontrei foi fazer o insert, caso dê erro, faça o update caso volte a dar erro aviso ao usuário.
        Traduzindo :
        insert …
        if erro then
        update …
        if erro then
        raise
        end if
        end if

        Você vai perguntar por que não faço uma consulta antes para saber o que fazer, vou te dizer que é muito mais “barato” fazer a transação direto e testar o erro do que consultar para decidir o que fazer…

        Não lembro qual a variável que verifica erro já que faz muito tempo que não faço procedures…
        Se a grande maioria das transações for update, então inverta o processo, faça update, teste e faça insert…
        Não esqueça de fazer teste para tudo o que for fazer e anunciar qualquer tipo de falha, relevante ou não, pois disso depende o bom andamento de qualquer sistema…

        #80592
        carloscps
        Participante

          Marcio, obrigado pela atenção, mas o que eu queria, era exatamente fazer o teste. Alguem sabe como faz?

          Obrigado

          #80593
          Marcio68Almeida
          Participante

            Tente isto…

            select count(*) into variavel
            from tabela
            where condição

            if variavel = 0 then
            insert
            else
            update
            end if

            #80598
            carloscps
            Participante

              Márcio, resolvido meu problema.

              Obrigado

              Carlos

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