【问题标题】:Drop DB2 table if exists如果存在则删除 DB2 表
【发布时间】:2015-03-17 17:45:48
【问题描述】:

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

我首先想到的是:

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

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

但是如果有人已经把桌子掉了怎么办?

我看到一些系统有“如果存在则丢弃”,但不幸的是 DB2 没有。当放置表失败时,我想做一些不会使脚本死亡的事情。

想法?关于这些?谢谢!

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

【问题讨论】:

标签: perl db2


【解决方案1】:

最好的方法是使用匿名块,例如 code

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

--#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 中正常运行。它不需要是过程或函数的一部分。

【讨论】:

  • 我们应该学会复制粘贴而不出现语法错误(HANDLER)
【解决方案2】:

为什么不先找桌子呢?如果你找到它,它需要被丢弃;如果你不这样做,它不会。

【讨论】:

    【解决方案3】:

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

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

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

    如果这对您不起作用,请告诉我您遇到了什么错误,以便我可以尝试提供帮助:)

    或者这可能有效
    如果(不存在(创建表详细信息
    (
    id 整数,
    detaildept 没有 int,
    信息 varchar(255)
    );
    插入 detailval(1,1, '详细值 A');
    插入 detailval(2,1, '细节值 B');
    插入 detailval(3,1, '详细值 C');
    插入 detailval(4,2, '细节值 D');

            )  
    )   
    then customStoredproc('droptable');   
    

    结束如果;

    结束

    【讨论】:

      【解决方案4】:

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

      您也可以像这样轻松查询 syscat.tables:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-06
        • 2019-04-03
        • 1970-01-01
        • 1970-01-01
        • 2016-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多