【问题标题】:Check if declared global temporary table exists in current session检查当前会话中是否存在声明的全局临时表
【发布时间】:2013-07-04 08:01:26
【问题描述】:

如何检查当前会话中是否存在 DB2 中声明的全局临时表?

我需要为用户会话创建一次临时表,然后就我的应用程序而言,每次执行报告时都能够在其中插入行。因此,当报表执行超过第一次时,我需要从该表中删除所有行,然后用新行重新填充它。

现在创建临时表的方法在第二次执行时抛出42710 SQLSTATE error

此语句是否适用于我的实现:DECLARE CONTINUE HANDLER FOR SQLSTATE '42710' SET DGTT_FOUND=1 以及如何在 Java 中使用它(executeUpdate()?)

【问题讨论】:

    标签: java sql db2 temp-tables


    【解决方案1】:

    根据您的 DB2 版本,您可以在声明临时表时使用WITH REPLACE 选项,这不仅会成功,即使之前已经声明过该表,也会负责删除先前插入的行。

    DECLARE GLOBAL TEMPORARY TABLE mytab (
      ...
    ) NOT LOGGED WITH REPLACE
    

    【讨论】:

    • 这适用于 DB2 LUW 和 DB2 for i,但不适用于使用 DB2 z/OS 的用户。 DB2 z/OS 不支持 WITH REPLACE,至少从 v10 开始,但它可能会在未来的版本中得到支持。
    【解决方案2】:

    由于声明的临时表没有在目录中定义,而且它们只在你当前的会话中可见(每个会话可能对同一个临时表名称有不同的定义),你只能尝试查询表并分析回答。

    首先,尝试一下

    select count(0) from session.myTempTable
    

    如果 DB2 说它不存在,那么您可以定义一个新表。

    如果 DB2 说它确实存在,您可以创建或删除它,以便重新创建它。我认为这是你的情况,因为你有一个 SQL 状态 42710,然后你可以为你的代码创建一个处理程序。

    但是,处理程序可以在 SQL 过程中使用,因此您应该创建一个 SP,以便在查询之前调用。该SP会检查表是否存在,当它存在和不存在时,你将把你想做的事情。

    参考资料:

    句柄 - http://publib.boulder.ibm.com/infocenter/db2luw/v10r1/topic/com.ibm.db2.luw.apdv.sqlpl.doc/doc/c0009025.html

    表格 - http://publib.boulder.ibm.com/infocenter/db2luw/v10r1/topic/com.ibm.db2.luw.admin.dbobj.doc/doc/r0054491.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 2015-12-11
      相关资源
      最近更新 更多