删除DB2表(如果存在)

时间:2015-03-13 13:17:08

标签: perl db2

在我的脚本中,我必须对连接表进行大量选择,因此我决定将此连接放入时态表中。

首先我想:

1. Create table
2. Put the data from the join into a table
3. Drop the table 

但后来我想,如果在我放弃桌子之前脚本失败怎么办?

所以我决定选择:

1. Drop the table
2. Create the table
3. Put the data from the join into a table

我真的不介意在下次运行脚本之前是否将表保留在那里,所以第二个选项也可以。

但是,如果有人已经放弃了桌子怎么办?

我看到一些系统有“drop if if exists”但不幸的是没有DB2。我想做一些在drop table失败时不会使脚本死掉的事情。

想法?在任何一个?谢谢!

编辑:我忘了说这是PERL脚本!

4 个答案:

答案 0 :(得分:1)

执行此操作的最佳方法是使用此code

中的匿名阻止

您需要在动态sql中调用drop table,并在块中捕获异常。

--#SET TERMINATOR @
begin
  declare statement varchar(128);
  declare continue handle for sqlstate '42710' BEGIN END;
  SET STATEMENT = 'DROP TABLE MYTABLE';
  EXECUTE IMMEDIATE STATEMENT;
end @

此代码将在DB2中正常运行。它不需要是程序的一部分也不是函数。

答案 1 :(得分:0)

为什么不先找桌子?如果你发现它,它需要被删除;如果你不这样做,那就没有了。

答案 2 :(得分:0)

db2perf_quiet_drop可能会按你想要的方式工作..它是一个免费的附加组件:)

你也可以查看这篇文章..

http://www.dbforums.com/showthread.php?1609047-DB2-equivalent-for-mysql-s-DROP-TABLE-IF-EXISTS

如果这对您不起作用,请告诉我您的错误,以便我可以尝试帮助:)

或者这可能有效  if(NOT exists(创建表详细信息) (
   id int,
   detaildeptNo int,
   info varchar(255)
);
插入detailval(1,1,'详细值A');
插入detailval(2,1,'细节值B');
插入detailval(3,1,'细节值C');
插入detailval(4,2,'细节值D');

        )  
)   
then customStoredproc('droptable');   

结束如果;

结束

答案 3 :(得分:0)

我认为您应该考虑使用临时表( DECLARE GLOBAL TEMPORARY TABLE )。它们存储在临时表空间中,并在提交后自动删除。

您也可以轻松查询syscat.tables,如下所示:

select COUNT(*) from SYSCAT.TABLES where TRIM(TABNAME) = '<some_table_name>'

如果此查询返回0,则该表不存在。