Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 具有“On commit delete rows”的全局临时表不包含任何数据_Oracle_Oracle10g_Temp Tables - Fatal编程技术网

Oracle 具有“On commit delete rows”的全局临时表不包含任何数据

Oracle 具有“On commit delete rows”的全局临时表不包含任何数据,oracle,oracle10g,temp-tables,Oracle,Oracle10g,Temp Tables,我在创建脚本中定义了一个全局临时表GTT,使用提交时删除行的选项。我希望能够让不同的用户在GTT中看到他们自己的数据,而不是其他人会话的数据。这在我们的测试环境中非常有效 但随后,我将GTT部署为客户端数据库功能更新的一部分。客户打电话给我,我很不安,很担心,因为GTT不再保存任何数据,他们也不知道为什么 具体来说,如果有人这样做: insert into my_GTT (description) values ('Happy happy joy joy') 数据库将作出回应: 1 row i

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

但随后,我将GTT部署为客户端数据库功能更新的一部分。客户打电话给我,我很不安,很担心,因为GTT不再保存任何数据,他们也不知道为什么

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

insert into my_GTT (description) values ('Happy happy joy joy')
数据库将作出回应:

1 row inserted. 
0 rows returned.
但是,如果同一最终用户尝试:

select * from my_GTT
数据库将作出回应:

1 row inserted. 
0 rows returned.

这个问题发生在客户网站上,我们无法在内部复制。是什么导致了这种行为?

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


我的经验是在SQL Server中,这是默认情况,但我知道在Oracle中,默认情况是在显式提交之前保持事务打开。记住,我从2000年起就没有接触过甲骨文,我认为达米恩是对的,而且有一个自动提交。我唯一能想到的另一个选择是某种类型的连接池问题,即选择是从一个单独的会话中执行的,在提交时插入删除行=一个事务中的数据

在提交时保留行=一个数据库会话中的数据一个用户有2个会话=2个会话=不同的内容

如果GTT定义为ON COMMIT DELETE ROWS,则在任何显式提交或隐式提交=隐式提交=在任何DLL命令(例如,truncate table、alter index、add partition、modify column、exchange partition)后,GTT将为空:

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行,它将保留数据直到会话结束:

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

据我所知,它没有设置为自动提交。我们必须编写代码来显式提交内容,如果我们在代码中引发异常,则将内容插入其他表的过程字符串将自动撤消。select和insert的会话是相同的。自从我发布最初的问题以来,DBA一直存在这个问题,我不确定进展情况,除了它可能与用户的读取/更新权限有关。什么是playmate?这是另一个会话吗?您是否尝试过将表更改为ON COMMIT PRESERVE ROWS,只是为了看看会发生什么?Playmate是最终用户。这个问题发生在客户网站上,我们无法在内部复制。此外,我无法控制更改表代码,因为它位于客户端站点上。您是否了解过这一点?从表面上看,权限问题,即允许用户写入但不允许读取,似乎比某个地方的自动提交设置更不可能。现在回顾这个问题,我试图让它变得有趣,这让我想知道这个问题到底是关于什么的?我甚至不记得我在以前的工作中遇到过这个问题的是什么系统