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

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

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

  1. execute block as
  2. begin
  3. delete from table1;
  4. delete from table2;
  5. delete from table3;
  6. delete from table4;
  7. delete from table5;
  8. end

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

pbgvytdp

pbgvytdp1#

你不能这样做。表中引用的表 delete 的psql语句必须存在 execute block 在它运行之前成功编译。
相反,您需要使用包含 execute statement 动态执行语句和 when any 异常处理程序以继续处理任何错误。
例如,类似于:

  1. execute block as
  2. begin
  3. begin
  4. execute statement 'delete from table1';
  5. when any do
  6. begin
  7. -- ignore error
  8. end
  9. end
  10. begin
  11. execute statement 'delete from table2';
  12. when any do
  13. begin
  14. -- ignore error
  15. end
  16. end
  17. -- etc
  18. end

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

  1. execute block
  2. as
  3. declare variable tablename varchar(64);
  4. begin
  5. for select trim(rdb$relation_name)
  6. from rdb$relations
  7. where rdb$relation_name in ('TABLE1', 'TABLE2', 'TABLE3', 'TABLE4', 'TABLE5')
  8. into tablename do
  9. begin
  10. execute statement 'delete from "' || replace(tablename, '"', '""') || '"';
  11. end
  12. end

中的表名 IN -子句必须与存储的名称匹配(对于像 table1 意思是大写 TABLE1 ). 这个 replace(tablename, '"', '""') 只是为了完整性,在表名中转义可能的双引号。

展开查看全部

相关问题