未在db2中填充会话表

00jrzges  于 2022-12-04  发布在  DB2
关注(0)|答案(2)|浏览(170)

我正在使用一个带有一些会话表的存储过程。在我用新数据测试存储过程之前,一切都运行得很好。
用于检索会话表之外的数据的游标按预期返回记录,但是,当同一游标用于会话表时,会话表中没有写入任何内容。

INSERT INTO SESSION.TEMP_UNTIL (CUSTOMID, UNTIL) 
            WITH PERIODS AS (
                SELECT NAT.UNTIL FROM TOPM.NATIONALITYHIST NAT WHERE NAT.CUSTOMID = custId
                UNION
                SELECT CIVIL.UNTIL FROM TOPM.MARITALSTATUSHIST CIVIL WHERE CIVIL.CUSTOMID = custId
                UNION
                SELECT COUNTRY.UNTIL FROM TOPM.COUNTRYOFRESIDENCEHIST COUNTRY WHERE COUNTRY.CUSTOMID = custId
            )
            SELECT custId, PERIODS.UNTIL FROM PERIODS ORDER BY PERIODS.UNTIL ASC;

可能是什么原因导致了这样的行为,怎样才能避免上述行为?
临时表声明如下:

DECLARE GLOBAL TEMPORARY TABLE TEMP_UNTIL (
    CUSTOMID VARCHAR(36), UNTIL DATE
)
643ylb08

643ylb081#

DECLARE GLOBAL TEMOPORARY TABLE得缺省值为DELETE ON COMMIT,因此这些行只在事务得生命周期内存在于临时表中.
您需要执行单一交易范围内的所有工作,或在DECLARE GLOBAL TEMPORARY TABLE陈述式中加入ON COMMIT PRESERVE ROWS子句。例如:

DECLARE GLOBAL TEMPORARY TABLE TEMP_UNTIL (
    CUSTOMID VARCHAR(36), UNTIL DATE
)
    ON COMMIT PRESERVE ROWS
    NOT LOGGED;
wsxa1bj1

wsxa1bj12#

当您在客户端工具中关闭自动提交的情况下运行脚本时,以下select count(1) ...语句(按原样)和未注解的on commit preserve rows行的结果是什么?

declare global temporary table session.tables as 
(
select * from syscat.tables
) 
definition only
with replace 
--on commit preserve rows
not logged;

insert into session.tables
select * from syscat.tables;

select count(1) from session.tables;

commit;

select count(1) from session.tables;

相关问题