danilosfc 0 Denunciar post Postado Janeiro 22, 2013 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
Motta 645 Denunciar post Postado Janeiro 22, 2013 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