Так нельзя. Таблица, на которую есть ссылка в операторе 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, '"', '""')
используется только для полноты, чтобы избежать возможных двойных кавычек в именах таблиц.