Сконструировано динамически Sql с таблицей проверки наличия данных - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь преобразовать такой SQL в Oracle, который создается динамически и выполняется с Sql Server:

DECLARE @dynamicQuery varchar(8000)
DECLARE @criteriaMet BIT

SET @dynamicQuery = ''
IF @criteriaMet = 1
BEGIN
  SET @dynamicQuery = 'IF NOT EXISTS(SELECT TOP 1 1 FROM DATATABLE) '
END
SET @dynamicQuery = @dynamicQuery + 'INSERT INTO DATATABLE (...) VALUES (...)'

EXEC @dynamicQuery 

Но с Oracle я не могу использовать EXISTS в операторе IF и приходится объявлять переменные и выбирать счетчик в переменной, но выполнение этого внутри Dynami c SQL резко снижает удобочитаемость и увеличивает сложность. Есть ли более элегантный способ создания динамики c SQL, который проверяет наличие данных таблицы в Oracle на основе некоторых критериев?

1 Ответ

0 голосов
/ 03 августа 2020

Ваш пример не должен быть динамическим 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 || ')' ||

может применять любые условия, которые вы хотите.

...