具有“在提交删除行上”的全局临时表未保存任何数据

时间:2010-04-23 05:59:54

标签: oracle oracle10g temp-tables

我在创建脚本中定义了一个全局临时表(GTT),使用了删除提交行的选项。我希望能够让不同的用户在GTT中看到自己的数据,而不是其他人的会话数据。这在我们的测试环境中完美运行。

但是,我将GTT部署为客户端数据库功能更新的一部分。客户打电话让我心烦意乱,因为GTT不再持有任何数据,他们不知道为什么。

具体来说,如果有人这样做了:

insert into my_GTT (description) values ('Happy happy joy joy')

数据库会响应:

1 row inserted. 

但是,如果同一个最终用户尝试过:

select * from my_GTT

数据库会响应:

0 rows returned.

此问题发生在客户端网站上,我们无法在内部重现。可能导致这种行为的原因是什么?

3 个答案:

答案 0 :(得分:3)

ON COMMIT DELETE ROWS =一次交易中的数据

ON COMMIT PRESERVE ROWS =一个数据库会话中的数据(一个用户有2个会话= 2个会话=不同的内容)

如果GTT定义为ON COMMIT DELETE ROWS,那么在任何显式提交或隐式提交之后它将为空(=隐式提交=在任何​​DLL命令之后包括例如truncate table,alter index,add partition,modify column,exchange分区):

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

答案 1 :(得分:2)

您是否在目标环境中启用了某些设置,其中每个语句都是自动提交的?

(我的经验是在SQL Server中,这是默认设置,但我理解在Oracle中,默认是保持事务处于打开状态直到明确提交。记住,我从2000年开始就没有触及Oracle)

答案 2 :(得分:0)

我认为Damien是对的,并且有一个自动提交。我能提出的唯一其他选择是某种连接池问题(即选择是从单独的会话到插入完成)