Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

danilosfc

Copiar registro de um tabela para outra sem duplicar

Recommended Posts

Boa tarde!

 

Sou iniciante no SQL Oracle, estou com uma dificuldade.

 

Tenho um script que tem por objetivo copiar ou alimentar a outra tabela com os dados de outra tabela.

 

Porém, ao realizar a cópia, está sendo duplicado os dados. Se a tabela 01 já tiver "Dado 01" no momento que realizar a cópia dos dados da tabela 02, não pode duplicar o "Dado01" de novo.

 

Como a tabela já existe desde o inicio do ano retrasado e com informações duplicadas, eu não posso aplicar a constraint UNIQUE, pois da erro. Tenho que realizar essa mudança a partir de agora.

 

Como realizar essa validação, para que não duplique os dados?

 

-- Declara uma variável do tipo numérica.
DECLARE 
     w_cont NUMBER;

-- Declara o cursor.
CURSOR   c_simpro IS

-- Armazena esta consulta no Cursor c_simpro.
SELECT   sc.cd_simpro,
         sc.ds_produto,
         sp.qt_embalagem,
         MAX(sp.dt_vigencia)
FROM     simpro_cadastro sc,
         simpro_preco    sp
WHERE    sc.cd_simpro = sp.cd_simpro
GROUP BY sc.cd_simpro,
         sc.ds_produto,
         sp.qt_embalagem;

-- Inicio das instruções de executação.
BEGIN
   -- Criada uma variável temporária a ser incrementada: r_simpro.
   FOR r_simpro IN c_simpro LOOP
   
      -- Inicializa a variável w_cont com o valor 0.
      w_cont := 0;
      
      -- Conta o número de materiais com o cd_simpro fornecido.
      SELECT COUNT(1)
      INTO   w_cont
      FROM   pls_material pm
      WHERE  pm.cd_material_ops = r_simpro.cd_simpro;
      
      -- Se o número de linhas retornadas for igual a zero, realize a inserção de dados.
      IF w_cont = 0 THEN
         INSERT INTO pls_material(nr_sequencia,
                                  dt_atualizacao,
                                  nm_usuario,
                                  dt_atualizacao_nrec,
                                  nm_usuario_nrec,
                                  ie_tipo_despesa,
                                  cd_estabelecimento,
                                  nr_seq_estrut_mat,
                                  cd_simpro,
                                  ds_material,
                                  ie_situacao,
                                  ds_material_sem_acento,
                                  dt_inclusao,
                                  cd_material_ops_orig,
                                  cd_unidade_medida,
                                  cd_material_ops,
                                  qt_conversao_simpro)
                           VALUES(pls_material_seq.nextval,
                                  SYSDATE,
                                  'ES-SIMPRO',
                                  SYSDATE,
                                  'ES-SIMPRO',
                                  3,
                                  1,
                                  3,
                                  r_simpro.cd_simpro,
                                  r_simpro.ds_PRODUTO,
                                  'A',
                                  r_simpro.ds_PRODUTO,
                                  SYSDATE,
                                  r_simpro.cd_simpro,
                                  'un',
                                  TRIM(to_char(r_simpro.cd_simpro,'0000099999')),                                  
                                  r_simpro.qt_embalagem);      
         COMMIT;                         
      END IF;
      
      -- Se o material existe, então atualiza as colunas qt_conversao_simpro e a
      -- dt_atualizacao com a data atual do sistema de banco de dados.
      IF w_cont > 0 THEN
         UPDATE pls_material p
            SET p.qt_conversao_simpro = r_simpro.qt_embalagem,
                p.dt_atualizacao = SYSDATE
            
          WHERE p.cd_simpro = r_simpro.cd_simpro;
         COMMIT;
      END IF;  
   
   END LOOP;
END;

 

 

Obrigado!

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual a chave de pls_material ?

cd_material_ops ou cd_simpro ?

Ora se faz por ora por outro.

 

==

A lógica da SP parece correta, slect para ver se a chave existe, se existe update senão insert.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.