Fórum Melhorar desempenho procedure #405188
18/07/2011
0
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:
1ªbegin select nome into varnome from tab1 where data = vardata e codigo = varCodigo; exception when data no found then insert .....end
2ª 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
Ricardo Albano
Curtir tópico
+ 0Posts
18/07/2011
Marco Pinheiro
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.
Gostei + 0
18/07/2011
Ricardo Albano
Gostei + 0
19/07/2011
Ricardo Albano
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.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)