什么时候 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-AS
和 SELECT
语句的块:
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)。
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-AS
和 SELECT
语句的块:
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)。