Закрывает ли Oracle SYS_REFCURSOR, возвращаемый функцией, которая используется в операторе SELECT?

Мне нужно хранить некоторые запросы в БД (внутри функций в пакетах), а затем вызывать функции из SQL Developer (из ORDS), поэтому я обнаружил, что вы можете возвращать запросы в SYS_REFCURSOR из сохраненных функций следующим образом:

CREATE OR REPLACE FUNCTION test RETURN SYS_REFCURSOR AS
  vRC SYS_REFCURSOR;
BEGIN
  OPEN vRC FOR SELECT  *
               FROM    employees
               WHERE   empid = 34650;

  RETURN vRC;
END;

А позже просто извлеките данные в SQL Developer следующим образом:

SELECT  test
FROM    dual;

Итак, мой вопрос...

Это правильно? Я знаю, что каждый раз, когда мы ОТКРЫВАЕМ курсор, нам нужно явно ЗАКРЫТЬ его, и каждый пример этого, который у меня есть, закрывает refcursor в PL/SQL, и мне нужно получить данные из оператора SELECT (чтобы проанализировать его в JSON в РАЗРАБОТЧИК SQL).

Также я обнаружил, что в SQLPlus оператор «print» закрывает курсор после того, как он извлекает все данные, делает ли это также оператор SELECT в моем примере?


person Edgar Lozano    schedule 09.03.2016    source источник


Ответы (1)


Вы можете получить курсор и распечатать его содержимое следующим образом:

VARIABLE cur REFCURSOR;
BEGIN
  :cur := test();
END;
/
PRINT cur;

Операторы PRINT и SELECT будут читать курсор, и когда они прочитают все строки, они неявно закроют курсор. Вы не можете прочитать данные из курсора дважды (однако вы можете вызвать функцию несколько раз, чтобы получить несколько курсоров, содержащих одну и ту же информацию).

person MT0    schedule 09.03.2016
comment
@MTO Не могли бы вы предоставить авторитетную ссылку, которая PRINT и SELECT закрывает курсор в конце? Я думаю, вы правы, но я не могу найти его нигде в документации. - person Honza Zidek; 30.08.2018
comment
Это документация для выражения CURSOR и сообщает вы, когда он будет закрыт. - person MT0; 31.08.2018
comment
Я не знаком с понятиями - что именно в данной документации говорит о том, что PRINT и SELECT закрывают курсор? Я предполагаю, что это спрятано где-то в родительском материале, но я не уверен. Не могли бы вы изменить свой ответ, чтобы он объяснял это? Для вас, ребята из базы данных, это может быть очевидно, но для нас, бедных разработчиков Java, которые используют SQL только изредка, это не так ясно :) - person Honza Zidek; 01.09.2018
comment
Том предлагает вам обращаться с ними как с любым другим курсором и закрывать их, когда вы закончите с ними, вместо того, чтобы доверять им, чтобы они были закрыты сами по себе asktom.oracle.com/pls/asktom/ - person thatjeffsmith; 04.09.2018