首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对象不再存在

对象不再存在
EN

Stack Overflow用户
提问于 2018-12-26 07:57:29
回答 1查看 1.1K关注 0票数 2

我有一个返回光标的过程。

代码语言:javascript
运行
复制
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;

这很好用。

现在,我已经为一些性能问题创建了一个全局临时表,如下所示。

代码语言:javascript
运行
复制
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;

现在,当我试图从光标中获取数据时,我得到的错误如下:-

代码语言:javascript
运行
复制
ORA-08103: object no longer exists. 

我可以通过添加提交保存行来纠正这个错误,但是我想知道原因。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-26 08:06:18

提交后,您的数据不再存在。这是Oracle中临时表的工作方式。

光标基本上是引用表的。您不能返回不存在的对象,因此会发生错误,因为引用的数据不再存在.

您可以考虑返回Table对象,因为这种方法将数据存储在内存中。

官方文件上的参考资料说

REF游标是PL/SQL数据类型,其值是数据库上查询工作区的内存地址。实质上,REF游标是指向数据库中结果集的指针或句柄。REF游标具有以下特性:

  • 引用游标引用数据库上的内存地址。因此,客户端必须在引用游标的生存期内连接到数据库,才能访问它。
  • 参考游标涉及一个额外的数据库往返.当REF游标返回给客户端时,在客户端打开引用游标并请求数据之前不会返回实际数据。请注意,除非用户尝试读取数据,否则不会检索数据。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53929142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档