Похоже, что вы хотите воздействовать на записи только в FOO_TABLE
, если в BAR_TABLE
существует как минимум две связанные записи.Вы можете изменить определение foo_cursor
, чтобы учесть это требование, как показано ниже.Таким образом, вам не нужно итеративно проверять наличие записи в BAR_TABLE
каждый раз.
declare
cursor foo_cursor is
select *
from foo_table foo
where exists (select 1 from bar_table bar
where bar.bar_column = foo.foo_column
having count(*) > 1);
foo foo_cursor%ROWTYPE;
begin
open foo_cursor;
loop
fetch foo_cursor into foo;
exit when foo_cursor%NOTFOUND;
insert into uninteresting_table (some_column) VALUES
(foo.foo_column);
end loop;
close foo_cursor;
end;
/
С другой стороны, если вы хотите пропустить записи в FOO_TABLE
, которые уже имеютдве или более записей в BAR_TABLE
, вы можете просто инвертировать проверку существования, и все остальное будет таким же:
declare
cursor foo_cursor is
select *
from foo_table foo
where NOT exists (select 1 from bar_table bar
where bar.bar_column = foo.foo_column
having count(*) > 1);
foo foo_cursor%ROWTYPE;
begin
open foo_cursor;
loop
fetch foo_cursor into foo;
exit when foo_cursor%NOTFOUND;
insert into uninteresting_table (some_column) VALUES
(foo.foo_column);
end loop;
close foo_cursor;
end;
/
Если вы хотите обработать все записи в FOO_TABLE
, но выполнять дополнительные действия, когда дваили в BAR_TABLE
существует больше записей, вы можете сделать это, изменив свой foo_cursor
:
declare
cursor foo_cursor is
select foo.*
, case when exists (select 1 from bar_table bar
where bar.bar_column = foo.foo_column
having count(*) > 1)
then 'Y'
else 'N'
end has_two_or_more
from foo_table foo;
foo foo_cursor%ROWTYPE;
begin
open foo_cursor;
loop
fetch foo_cursor into foo;
exit when foo_cursor%NOTFOUND;
continue when foo.has_two_or_more = 'Y';
insert into uninteresting_table (some_column) VALUES
(foo.foo_column);
end loop;
close foo_cursor;
end;
/