Autor
Mensagem
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:
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
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.
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.
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.






