Функция, которая возвращает данные, полученные из запроса выбора - Oracle
Я пытаюсь написать функцию, которая вернет результат запроса select. Я работал с очень базовыми функциями, которые возвращают число и varchar2 (string). Но теперь я хочу вернуть результат выбора, который будет выглядеть как 10 строк и их соответствующие столбцы.
Как мне написать функцию и какой бы тип возвращался?
Примерной функцией, которую я написал, является:
создать или заменить функцию func1 верните varchar2 как начало return ('hello from func1'); end func1;
Я все еще на базовом уровне, так может ли кто-нибудь помочь мне с возвратом результата запроса select? Я считаю, что курсоры должны использоваться, поскольку будет более одной строки.
Ответы
Ответ 1
Обычно функция возвращает одну "вещь". Обычно это скаляр (число, varchar2, запись и т.д.), Хотя вы можете вернуть коллекцию. Например, вы можете вернуть коллекцию (в этом случае вложенную таблицу) со всеми значениями EMPNO из таблицы EMP
CREATE TYPE empno_tbl
IS TABLE OF NUMBER;
CREATE OR REPLACE FUNCTION get_empnos
RETURN empno_tbl
IS
l_empnos empno_tbl;
BEGIN
SELECT empno
BULK COLLECT INTO l_empnos
FROM emp;
RETURN l_empnos;
END;
Но это не особенно распространено в функции. Было бы более распространено, если бы функция возвращала курсор, а не возвращала значения, и чтобы обработчик вызывающего пользователя извлекал данные, т.е.
CREATE OR REPLACE FUNCTION get_empnos2
RETURN SYS_REFCURSOR
IS
l_rc SYS_REFCURSOR;
BEGIN
OPEN l_rc
FOR SELECT empno
FROM emp;
RETURN l_rc;
END;
Но даже это не особенно распространено в Oracle. В зависимости от того, что вы пытаетесь выполнить, обычно было бы проще просто создать представление, в котором были выбраны данные, которые вас интересовали, и запросить это представление, а не вызывать функцию или процедуру.
Ответ 2
Хорошо, если вы просто учитесь, вы должны знать о конвейерных функциях. Консолидированная функция позволяет возвращать динамически генерируемые таблицы в PLSQL.
Например...
create function
gen_numbers(n in number default null)
return array
PIPELINED
as
begin
for i in 1 .. nvl(n,999999999)
loop
pipe row(i);
end loop;
return;
end;
Что я взял из http://www.akadia.com/services/ora_pipe_functions.html: -)
Ответ 3
Без контекста того, как вы будете называть эту функцию, я немного потерял точно, как вам помочь.
Вы уверены, что вам не будет лучше с подзапросом, объединением или представлением?