ON COMMIT DELETE ROWS
= 一笔交易中的数据
ON COMMIT PRESERVE ROWS
= 一个数据库会话中的数据(一个用户有 2 个会话 = 2 个会话 = 不同的内容)
如果 GTT 用 定义ON COMMIT DELETE ROWS
,则在任何显式提交或隐式提交之后它将为空(= 隐式提交 = 在任何 DLL 命令之后,包括例如截断表、更改索引、添加分区、修改列、交换分区):
CREATE GLOBAL TEMPORARY TABLE GTT__TEST (A NUMBER) ON COMMIT DELETE ROWS;
INSERT INTO GTT__TEST VALUES (1);
SELECT * FROM GTT__TEST; -- 1 ROW;
COMMIT; -- commit = delete rows
SELECT * FROM GTT__TEST; -- 0 ROWS;
INSERT INTO GTT__TEST VALUES (1);
SELECT * FROM GTT__TEST; -- 1 ROW;
ALTER TABLE GTT__TEST MODIFY A NOT NULL; -- DLL = commit = delete rows
SELECT * FROM GTT__TEST; -- 0 ROWS
如果 GTT 定义为ON COMMIT PRESERVE ROWS
,它将保存数据直到会话结束:
DROP TABLE GTT__TEST;
CREATE GLOBAL TEMPORARY TABLE GTT__TEST (A NUMBER) ON COMMIT PRESERVE ROWS;
INSERT INTO GTT__TEST VALUES (1);
SELECT * FROM GTT__TEST; -- 1 ROW
COMMIT;
SELECT * FROM GTT__TEST; -- 1 ROW