什么时候 DB2 声明的全局临时表会自动删除...?

At what point are DB2 declared global temporary tables automatically deleted...?

DB2 何时被声明为全局临时 tables 'cleaned up' 并被系统自动删除...?这适用于 AS400 v7r3m0 上的 DB2,使用 DBeaver 5.2.5 作为开发客户端,使用 MS-Access 2007 为最终用户打包应用程序。

今天我开始尝试使用 DGTT,感谢 this answer。到目前为止,我对这些功能很满意,尽管我确实发现我们最近的系统版本有 WITH DATA 选项,这是一个明显的优势。

一切正常,但有时我收到此错误:

SQL Error [42710]: [SQL0601] NEW_PKG_SHEETS_DATA in QTEMP type *FILE already exists.

错误的意思很明显,但时机不对。今天开始的时候可以运行多次查询,都没有报错。好像系统正在清理并删除它,这正是我正在寻找的。但是后来错误开始了,现在发生的频率更高了。

如果我有策略地使用 DROP TABLE,这会解决错误,除非 table 不存在,在这种情况下我会收到另一个错误。我也可以 disconnect/reconnect 从我的 SQL 开发客户端到服务器,正如我所料,因为那肯定会丢弃会话。

这个 IBM article about DGTTs speaks much of sessions, but not many specifics. And this article 可能是我在 IBM 文档中遇到的最长的命令语法。我通过了它,但它没有回答什么决定何时删除 DGTT 的问题。

所以想请教一下:

会话的边界​​是什么..?

我认为这可能是由我的 SQL 客户端中的环境定义的..?

我想 best/safest 要做的事情是根据需要使用 DROP TABLE..?

是否有人可以分享任何提示、技巧或建议......?

下面是我正在开发的SQL。为简洁起见,我排除了 WITH-ASSELECT 语句的块:

DROP TABLE SESSION.NEW_PKG_SHEETS ; 

DECLARE GLOBAL TEMPORARY TABLE SESSION.NEW_PKG_SHEETS_DATA

    AS  (   WITH        FIRSTDAY AS (SELECT (YEAR(CURDATE() - 4 MONTHS) * 10000) + 
                                            (MONTH(CURDATE() - 4 MONTHS) * 100) AS DATEISO
                                     FROM   SYSIBM.SYSDUMMY1
            -- <VARIETY OF ADDITIONAL CTE CLAUSES>
            -- <SELECT STATEMENT BELOW IS A BIT LONGER>
            SELECT      DAACCT                                      AS DAACCT,
                        DAIDAT                                      AS DAIDAT,
                        DAINV#                                      AS DAINV,
                        CAST(DAITEM AS NUMERIC(6))                  AS DAPACK,
                        CAST(0 AS NUMERIC(14))                      AS UPCNUM,
                        DAQTY                                       AS DAQTY
            FROM        DAILYTRANS
            AND         DAIDAT >= (SELECT DATEISO+000 FROM FIRSTDAY)                -- 1ST DAY FOUR MONTHS AGO
            AND         DAIDAT <= (SELECT DATEISO+399 FROM FIRSTDAY)                -- LAST DAY OF LAST MONTH
    ) WITH DATA ;

DROP TABLE SESSION.NEW_PKG_SHEETS ; 

只有当连接成功结束时,DGTT 才会被 Db2 自动清除(connect reset 或等同于正在使用的 Db2 的任何接口)。

对于 Db2 for i 和 Db2-LUW,请考虑对 DECLARE GLOBAL TEMPORARY TABLE 语句使用 WITH REPLACE 子句。如果会话保持打开状态,这将确保您不需要显式删除 DGTT,但无论 DGTT 是否已经存在,代码都需要在下次执行时替换 table。

使用 WITH REPLACE 子句意味着您无需担心为 DGTT 发布 DROP 声明,除非您真的想发布 drop。

有时会话可能会被重新使用,或者 close/disconnect 可能不会发生或可能不会完成,或者更有可能是工作站执行重试,在这些情况下 WITH REPLACE 可能是必不可少的轻松避免运行时错误。

请注意,Z/OS 的 Db2(在 v12)不提供 DGTT 的 WITH REPLACE 子句,而是有一个可选的语法 on commit drop table(但这没有为 Db2 记录-for-i 和 Db2-LUW)。