我想编写可用于具有相似结构的多个数据库的执行块,有些数据库没有 1 个或多个表。我用这样的东西
execute block as
begin
delete from table1;
delete from table2;
delete from table3;
delete from table4;
delete from table5;
end
这适用于所有表的基础,但是当表丢失时,执行块停止。我想在缺少表时使用此执行块,因此我不必提交缺少的表。
我想编写可用于具有相似结构的多个数据库的执行块,有些数据库没有 1 个或多个表。我用这样的东西
execute block as
begin
delete from table1;
delete from table2;
delete from table3;
delete from table4;
delete from table5;
end
这适用于所有表的基础,但是当表丢失时,执行块停止。我想在缺少表时使用此执行块,因此我不必提交缺少的表。
你不能这样做。PSQL 语句中引用的delete
表必须存在execute block
才能成功编译,然后才能运行。
相反,您将需要使用包含 a 的语句块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, '"', '""')
只是为了完整地转义表名中可能的双引号。