关于存储过程使用临时表的问题
-- Create table
create global temporary table T_SOLVENCY
(
L_BH NUMBER,
VC_BH VARCHAR2(20),
VC_NAME VARCHAR2(200),
VC_PUBLISH_ORGAN VARCHAR2(200)
)
on commit preserve rows;
如上,我创建了一个临时表,但是我在存储过程里对这张表写入数据后,过程执行完后,查了一下该临时表,始终为空?注,存储过程百分之一千没有问题.
不知怎么回事? on commit preserve rows;这句话应该就是说明该表的数据是在同一个会话中有效的,为什么在存储过程里执行插不进去??
------解决方案--------------------临时表是事务提交后就清空的吧。。。。
------解决方案--------------------还是要查查你的百分之一千的过程,insert是否成功了,是否commit了,
SQL>
SQL> create global temporary table T
2 (
3 A VARCHAR2(255)
4 )
5 on commit preserve rows;
Table created
SQL> insert into t values( 'a ');
1 row inserted
SQL> commit;
Commit complete
SQL> select * from t;
A
--------------------------------------------
a
------解决方案--------------------你的表应用在存储过程中肯定是没有问题的,如果在存储过程中返回结果集肯定有数据,但是你想在你执行存储过程后在去查看这个表肯定是没有输据的
------解决方案--------------------你的存储过程调用结束后临时表自动清空了
------解决方案--------------------应该是你的存储过程结束后,该表中的内容就自动清空了吧
------解决方案--------------------在存储过程中插入临时表后,就查询临时表的记录数,看看是否插入成功,然后在commit和存储过程结束处再分别查临时表记录数。
------解决方案--------------------create global temporary table T
(
A VARCHAR2(255)
)
on commit preserve rows;
CREATE OR REPLACE procedure ll00003
is
begin
insert into t values( 'a ');
end;
/
------------
test1
begin
ll00003;
end;
select * from t;
---a
test2
begin
ll00003;
end;
commit;
---
a
a
select * from t;
------解决方案--------------------在存储过程commit之前执行是可以查到临时表里的数据的.
貌似这个临时表只是事务级别的.
--建议lz重新创建一下临时表
------解决方案--------------------看不出有什么错误,建议用以下代码测试一下
sqlplus myconnection
-- execute procedure
my_procedure;
select * from T_SOLVENCY;
------解决方案--------------------仔细查查存储过程吧,看看在存储过程中对这个表insert后是否又做了其他动作。
------解决方案--------------------临时表是transaction结束后会自动清空的,执行一个procedure结束后也会自动结束transaction (相当于一个DDL过程或者DML的commit/rollback),所以procedure结束后procedure里面的对临时表的插入也会清空,不管你commit与否.
------解决方案--------------------临时表是事务级的。数据只在本事务有效。
过程操作只是借来储存数据,其它连接查看,或者用该临时表,都是空的。
临时表,数据临时的!