1

我想编写可用于具有相似结构的多个数据库的执行块,有些数据库没有 1 个或多个表。我用这样的东西

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

这适用于所有表的基础,但是当表丢失时,执行块停止。我想在缺少表时使用此执行块,因此我不必提交缺少的表。

4

1 回答 1

2

你不能这样做。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, '"', '""')只是为了完整地转义表名中可能的双引号。

于 2020-07-13T08:39:32.647 回答