Как пропустить / продолжить оператор удаления, когда таблица не существует? - PullRequest
1 голос
/ 13 июля 2020

Я хочу написать блок выполнения, который можно использовать для нескольких баз данных с похожей структурой, в некоторых нет одной или более таблиц. Я использую что-то вроде этого

 execute block as
 begin
 delete from table1;
 delete from table2;
 delete from table3;
 delete from table4;
 delete from table5;
 end

, и это работает для базы со всеми таблицами, но когда таблица отсутствует, блок выполнения останавливается. Я хочу использовать этот блок выполнения, когда отсутствует таблица, поэтому мне не нужно фиксировать недостающую.

1 Ответ

2 голосов
/ 13 июля 2020

Так нельзя. Таблица, на которую есть ссылка в операторе delete PSQL, должна существовать для успешной компиляции execute block, прежде чем он сможет даже запуститься.

Вместо этого вам нужно будет использовать блоки операторов, содержащие execute statement для динамического выполнения операторов и when any обработчика исключений для продолжения обработки любой ошибки.

Например, что-то вроде:

execute block as
begin
  begin
    execute statement 'delete from table1';
    when any do
    begin
      -- ignore error
    end
  end
  begin
    execute statement 'delete from table2';
    when any do
    begin
      -- ignore error
    end
  end
  -- etc
end

также проверьте наличие в системных таблицах перед динамическим выполнением удаления. Например, что-то вроде:

execute block
as
declare variable tablename varchar(64);
begin
  for select trim(rdb$relation_name) 
      from rdb$relations 
      where rdb$relation_name in ('TABLE1', 'TABLE2', 'TABLE3', 'TABLE4', 'TABLE5')
      into tablename do
  begin
    execute statement 'delete from "' || replace(tablename, '"', '""') || '"';
  end
end

Имена таблиц в предложении IN должны совпадать с сохраненным именем (для имен объектов без кавычек, таких как table1, это означает TABLE1 в верхнем регистре). replace(tablename, '"', '""') используется только для полноты, чтобы избежать возможных двойных кавычек в именах таблиц.

...