Функция, которая возвращает данные, полученные из запроса выбора - 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

Без контекста того, как вы будете называть эту функцию, я немного потерял точно, как вам помочь.

Вы уверены, что вам не будет лучше с подзапросом, объединением или представлением?