Объект больше не существует - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть процедура, с помощью которой я возвращаю курсор.

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. 

Я могу исправить эту ошибку, добавив строки сохранения коммита, но я хочуузнать причину.

1 Ответ

0 голосов
/ 26 декабря 2018

После фиксации ваши данные больше не существуют.Так работает Временные таблицы в Oracle.

Курсор - это в основном ссылка на таблицу.Вы не можете вернуть несуществующий объект, поэтому ошибка возникает из-за того, что ссылочных данных больше нет.

Вы можете рассмотреть возможность возврата объекта типа таблицы, так как этот подход хранит данные в памяти.

Ссылка из официальной документации гласит: :

REF CURSOR - это тип данных PL / SQL, значением которого является адрес памяти рабочей области запроса в базе данных.По сути, REF CURSOR - это указатель или дескриптор набора результатов в базе данных.REF CURSOR имеют следующие характеристики:

  • REF CURSOR ссылается на адрес памяти в базе данных.Следовательно, клиент должен быть подключен к базе данных в течение срока службы REF CURSOR, чтобы получить к ней доступ.

  • REF CURSOR включает в себя дополнительную передачу данных в обе стороны.Пока REF CURSOR возвращается клиенту, фактические данные не возвращаются, пока клиент не откроет REF CURSOR и не запросит данные.Обратите внимание, что данные не будут извлечены, пока пользователь не попытается их прочитать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...