Процедура Oracle: варианты возврата данных

Я привык к Microsoft SQL Server, где последний SELECT запрос хранимой процедуры определяет, что возвращается.

В Oracle я всегда использую параметр SYS_REFCURSOR OUT для возврата данных из запросов.

Существуют ли другие варианты возврата данных из SELECT запросов в хранимых процедурах Oracle?

Как насчет SELECT запросов, которые выбирают только одну строку? SYS_REFCURSOR все еще необходим?

РЕДАКТИРОВАТЬ: мне нужно знать ответ для Oracle 11g R2 (я должен был упомянуть об этом явно, а не только в тегах).


person Bass    schedule 17.01.2014    source источник


Ответы (4)


До сих пор Oracle не поддерживал стиль процедур SQL Server, неявно возвращающих набор результатов, вам приходилось явно возвращать что-то, например SYS_REFCURSOR, коллекцию или что-то еще.

В Oracle 12C была добавлена ​​новая функция под названием неявные результаты утверждения, который предназначен для имитации способа работы SQL Server. Однако это действительно предназначено для поддержки миграции существующего кода с SQL Server; для свежих разработок Oracle вам лучше всего было бы узнать, как Oracle обычно делает что-то.

person Tony Andrews    schedule 17.01.2014
comment
Спасибо! Что вы имеете в виду под или коллекцией чего угодно? - person Bass; 17.01.2014
comment
Я сказал «сборник» или что угодно, имея в виду лишь то, что, согласно ответу Николя Дюрана, есть много других вариантов. - person Tony Andrews; 17.01.2014
comment
Извините моя ошибка. Спасибо! - person Bass; 17.01.2014

Процедуры Oracle PL / SQL могут возвращать все поддерживаемые базовые типы данных (дата, varchar2, число) плюс комплексные (записи, таблицы, varray).

person Nicolas Durand    schedule 17.01.2014

Другой вариант - конвейерная функция, в которой вы вызываете функцию как:

select ...
from   table(my_function(param1 => 1, ...))

Подробности см. В документации.

person David Aldridge    schedule 17.01.2014

Просто для пояснения, процедуры ORACLE не могут «RETURN» как таковые, параметр SYS_REFCURSOR OUT больше похож на изменение значения ссылки на переменную внутри процедуры. Помимо SYS_REFCURSOR, если вы возвращаете только одну строку таблицы, скажем EMPLOYEE, вы также можно определить запись как EMPLOYEE%ROWTYPE и использовать ее как тип OUT.

Или вроде:

PROCEDURE pr_proc (v_input in number
                   v_emp_row out EMPLOYEE%ROWTYPE )
    IS
person A Nice Guy    schedule 17.01.2014