我有一个返回光标的过程。
create or replace procedure pkg_test(cur out sys_refcursor) is
begin
insert into tb_test values(1);
insert into tb_test values(2);
insert into tb_test values(3);
open cur for
select * from tb_test;
delete from tb_test;
commit;
end pkg_test;这很好用。
现在,我已经为一些性能问题创建了一个全局临时表,如下所示。
create global temporary table tb_test_GTT (deal_id int)
on commit delete rows;
create or replace procedure pkg_test(cur out sys_refcursor) is
begin
insert into tb_test_GTT values(1);
insert into tb_test_GTT values(2);
insert into tb_test_GTT values(3);
open cur for
select * from tb_test_GTT;
delete from tb_test_GTT;
commit;
end pkg_test;现在,当我试图从光标中获取数据时,我得到的错误如下:-
ORA-08103: object no longer exists. 我可以通过添加提交保存行来纠正这个错误,但是我想知道原因。
发布于 2018-12-26 08:06:18
提交后,您的数据不再存在。这是Oracle中临时表的工作方式。
光标基本上是引用表的。您不能返回不存在的对象,因此会发生错误,因为引用的数据不再存在.
您可以考虑返回Table对象,因为这种方法将数据存储在内存中。
REF游标是PL/SQL数据类型,其值是数据库上查询工作区的内存地址。实质上,REF游标是指向数据库中结果集的指针或句柄。REF游标具有以下特性:
https://stackoverflow.com/questions/53929142
复制相似问题