Ваш пример не должен быть динамическим c, поэтому вы можете выполнить stati c count, logi c, чтобы проверить счет, а затем stati c вставить, если подходит:
declare
cnt pls_integer;
begin
select count(*)
into cnt
from dual
where exists (select null from your_table);
if cnt = 0 then
insert into your_table (id, foo) values (1, 'bar');
end if;
end;
/
Вам вообще не нужен PL / SQL, вы можете сделать insert ... select ...
и сделать exists
часть проверки:
insert into your_table (id, foo)
select 1, 'bar'
from dual
where not exists (select null from your_table);
db <> fiddle
Любой из них может быть преобразован в динамический c, если на самом деле есть причина для этого, например, имя таблицы времени выполнения; второй вариант, вероятно, по-прежнему будет более читабельным - первым будет запрос Dynami c, за которым следует logi c для выполнения Dynami c insert.
Я пытаюсь прикрепить дополнительную проверку к существующему оператору Merge, только если соблюдаются некоторые критерии, поэтому меньше изменений в исходном
Вы можете изменить TBL2
на подзапрос , которые применяют нужные вам условия; когда они не выполняются, слияние не может совпадать. Что-то вроде:
'MERGE INTO' || TBL || ' USING ( SELECT * FROM ' || TBL2 ||
' WHERE NOT EXISTS (SELECT NULL FROM ' || TBL || ')' ||
' )' ON (' || COLS || ' ) WHEN NOT MATCHED THEN INSERT ( ' || COLS || ' VALUES (' || COLS || ')'
... где средняя строка
' WHERE NOT EXISTS (SELECT NULL FROM ' || TBL || ')' ||
может применять любые условия, которые вы хотите.