日期:2014-05-17  浏览次数:20891 次

关于存储过程使用临时表的问题
--   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与否.
------解决方案--------------------
临时表是事务级的。数据只在本事务有效。

过程操作只是借来储存数据,其它连接查看,或者用该临时表,都是空的。

临时表,数据临时的!