2015-03-13 1078 views
0

在我的脚本中,我必须对连接表执行大量选择,因此我决定将此连接放入临时表中。删除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 exists”,但不幸的是不是DB2。我想做一些不会让脚本在drop table失败时死掉的东西。

想法?在这一切?谢谢!

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

+0

您可以使用['$ dbh-> tables'](http://search.cpan.org/~hoymich/DBD-DB2-0.78-5.8.4/lib/DBD)检查给定表的存在/DB2.pod#Getting_Table_information) – Borodin 2015-03-13 13:48:20

回答

0

为什么不先查找表格?如果你发现它,它需要被丢弃;如果你不这样做,它不会。

0

db2perf_quiet_drop可能运作的,你想要的方式。它的一个免费附加:)

你可以看看这个帖子太..

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

如果这不起作用为你请让我知道你得到什么错误,所以我可以尝试帮助:)

或这可能会工作
如果(不存在(创建表detailval

ID INT,
detaildeptNo INT,
信息VARCHAR(255)
);
insert into detailval(1,1,'detail values A');
insert into detailval(2,1,'detail values B');
insert into detailval(3,1,'detail values C');
insert into detailval(4,2,'detail values D');

 ) 
) 
then customStoredproc('droptable'); 

end if;

1

要做到这一点,最好的办法是通过使用annonymous块就像这个code

你需要调用的动态SQL删除表,并赶上该块中的例外。

--#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中正常运行。它不需要成为程序或功能的一部分。

0

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

您可以轻松地查询也SYSCAT.TABLES这样的:

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

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