По чему сессия не закрывается, а продолжает работать после показа результирующего набора sql?

Есть большая таблица. После каждого select на эту таблицу, быстро показывается результирующий набор из 50 строк, но сессия продолжает работать. Если запустить аналогичный запрос то появляеся новый sid, и у всех в EVENT 'send bkld' Как вызывать select больших таблиц, что бы после показа N- строк результирующего набора сессия закрывалась , то есть не продолжалась загрузка таблицы в 'bkld' ?


Ответы (1 шт):

Автор решения: 0xdb

В общем структура работы с данными в БД следующая:

  • одно соединение (connect) может иметь от 0 до N сессий (session) БД
  • одна сессия БД может открывать и закрывать один или более курсоров

Сессия и курсоры должны быть закрыты явно. Исключение: приложение или инструмент могут выполнять закрытие/разединение неявно.

Подробнее следует ознакомится с концепциями БД в оф.документации.

На простом примере с SQL*Plus (см. комментарии):

$ sqlplus /nolog
-- пока нет соединения
SQL> connect user/pass@localhost/pdb1
Connected.
-- установленно соединение и открыта сессия БД
SQL> create table bigtab (id) as
  2  select rownum from xmlTable ('1 to 100000');

Table created.
SQL> var rc refcursor
SQL> exec open :rc for select * from bigtab;

PL/SQL procedure successfully completed.
--обьявлен и открыт один курсор

SQL> declare ids sys.odciNumberList;
  2  begin  fetch :rc bulk collect into ids limit 50; end;
  3  /

PL/SQL procedure successfully completed.
-- считано 50 записей из открытого курсора
 
SQL> exec close :rc

PL/SQL procedure successfully completed.
-- курсор закрыт

SQL> disconnect
Disconnected from Oracle Database [...]
-- сессия БД закрыта, но соединение ещё осталось

SQL> exit
-- приложение закрыто, соединение разорванно 
→ Ссылка