我正在使用Hibernate。我需要获取大约1000000条记录,这将导致超时异常。因此,我使用setfetchsize6000条记录,以便它将操作分散到6000条记录中的多个事务中。
setfetchsize
获取所有内容大约需要21个小时。
但是同时检索记录时,如果有人删除了要提取的记录之一,我就会得到ORA-08103: object no longer exists。
ORA-08103: object no longer exists
现在,我想跳过在检索时删除的对象。我怎样才能做到这一点?
最有可能基于已使用ON COMMIT DELETE ROWSoption 创建的全局临时表(GTT)打开了游标。ORA-08103: object no longer exists错误的原因是commit语句之后紧随其后的delete语句。这是一个简单的示例:
ON COMMIT DELETE ROWS
commit
delete
SQL> declare 2 type t_recs is table of number; 3 l_cur sys_refcursor; -- our cursor 4 l_rec t_recs; 5 6 begin 7 8 -- populating a global temporary table GTT1 with sample data 9 insert into GTT1(col) 10 select level 11 from dual 12 connect by level <= 1000; 13 14 open l_cur -- open a cursor based on data from GTT1 15 for select col 16 from GTT1; 17 18 -- here goes delete statement 19 -- and 20 commit; <-- cause of the error. After committing all data from GTT1 will be 21 -- deleted and when we try to fetch from the cursor 22 loop -- we'll face the ORA-08103 error 23 fetch l_cur -- attempt to fetch data which are long gone. 24 bulk collect into l_rec; 25 exit when l_cur%notfound; 26 end loop; 27 28 end; 29 / ORA-08103: object no longer exists ORA-06512: at line 24
带有on commit preserve rows语句的全局临时表的创建将允许从基于该表的游标中安全地获取数据,而不必担心会遇到 ORA-08103:错误。
on commit preserve rows
ORA-08103: