sql—当表不存在时,如何跳过/继续delete语句?

lokaqttq  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(700)

我想写一个execute块,可以用于多个结构相似的数据库,有些数据库没有一个或多个表。我用这种东西

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

这适用于所有表的base,但当表丢失时,execute块停止。我想在缺少表时使用这个执行块,这样就不必提交缺少的表。

pbgvytdp

pbgvytdp1#

你不能这样做。表中引用的表 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

您还可以在动态执行delete之前检查系统表中是否存在。例如,类似于:

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, '"', '""') 只是为了完整性,在表名中转义可能的双引号。

相关问题