DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:
 
 

Fórum DevMedia


Autor
Mensagem
RICARDO SONAGLIO ALBANO
 

País: Brasil
Estado: PR
Cidade: Curitiba
Mensagens: 7
 Postado em: 18/7/2011 3:40:27 PM

Olá,

Estou executando uma procedure para inserir dados de outra tabela. 
Leio o cursor da tabela e conforme os dados incluo na nova tabela.
Até tudo bem, a tabela tem aproximadamente 1 milhão de registro, mas a inclusão esta rápida. 

O problema é que terei que incluir uma verificação se os dados já existem, ou seja, antes de incluir devo verificar se os mesmos já existem.  Quando faço esta verificação fica muito lento.

Já tentei:

begin
  select nome into varnome from tab1 where data = vardata e codigo = varCodigo;
  exception
    when data no found then
        insert .....
end

  select count(nome) into varx from tab1 where data = vardata e codigo = varCodigo;
  if varx <> 0 then
     insert ......
  end;


Já criei um ínidice com os campos data e codigo, mas aí dá erro na procedure, não inseri.

Alguém tem alguma sugestão?

Fico no aguardo,

Ricardo
Marco Pinheiro
 
 


País: Brasil
Estado: MG
Cidade: Belo Horizonte
Mensagens: 110
 Postado em: 18/7/2011 5:42:34 PM
As vezes se vc tentar usar o MERGE possa ajudar.

Segue abaixo um exemplo que achei na net:


CREATE TABLE TEST (
ID NUMBER,
a VARCHAR2(10),
b VARCHAR2(10),
CONSTRAINT pk_test PRIMARY KEY (ID) );

MERGE INTO TEST t
USING (SELECT 1 ID, 'a' a, 'b' b FROM dual) new_row
ON (t.id = new_row.id)
WHEN MATCHED THEN
UPDATE SET t.a = new_row.a,
           t.b = new_row.b
WHEN NOT MATCHED THEN
INSERT (ID, a, b) VALUES (new_row.id, new_row.a, new_row.b);


MERGE INTO TEST t
USING (SELECT 1 ID, 'x' a, 'y' b FROM dual) new_row
      ON (t.id = new_row.id)
WHEN MATCHED THEN
UPDATE SET  t.a = new_row.a,
            t.b = new_row.b
WHEN NOT MATCHED THEN
INSERT (ID, a, b) VALUES (new_row.id, new_row.a, new_row.b);

Att.,

Marco.

 
RICARDO SONAGLIO ALBANO
 

País: Brasil
Estado: PR
Cidade: Curitiba
Mensagens: 7
 Postado em: 18/7/2011 7:55:26 PM
Valeu, vou testar

 
RICARDO SONAGLIO ALBANO
 

País: Brasil
Estado: PR
Cidade: Curitiba
Mensagens: 7
 Postado em: 19/7/2011 8:57:46 AM
Olá,

Testei o merge, mas não consegui fazer funcionar. Pois tenho que testar e gravar na mesma tabela.

Fiz alguns tipos de merge:


         merge into tabela exemplo
         using tabela exemplo2
         on  (exemplo.data  = A 
         and  exemplo.codigo = B)
         when not matched then


         merge into tabela exemplo
         using (select data, codigo from tabela
                where  data  = A 
                and    codigo = B) exemplo2
         on  (exemplo.data  = exemplo2.data 
         and  exemplo.codigo = exemplo2.codigo)
         when not matched then


         merge into tabela exemplo
         using (select data, codigo from tabela) exemplo2
         on  (exemplo2.data  = A 
         and  exemplo2.codigo = B)
         when not matched then



         merge into tabela exemplo
         using (select exemplo3.sequencial from tabela exemplo3
                where  exemplo3.data  = A 
                and    exemplo3.codigo = B) exemplo2
         on  (exemplo.sequencial  = exemplo2.sequencial)
         when not matched then


         merge into tabela exemplo
         using (select * from tabela) exemplo2
         on  (exemplo.data  = A 
         and  exemplo.codigo = B)

Mas não funciona. Não inclui o registro.
Vale lembrar que os campos DAta e codigo, são os dois campos que me possibilitam verificar a existência do registro. O sequencial é a PK.


 
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2012 - Todos os Direitos Reservados a web-03