Функция, которая будет возвращать данные, полученные из запроса выбора - Oracle - PullRequest
10 голосов
/ 20 января 2011

Я пытаюсь написать функцию, которая бы возвращала результат запроса select. Я работал с очень простыми функциями, которые возвращали бы число и varchar2 (строку). Но теперь я хочу вернуть результат выбора, который будет выглядеть как 10 строк и соответствующих им столбцов.

Как бы я написал функцию и каким был бы тип возвращаемого значения?

Пример написанной мной функции:

создание или замена функции func1 вернуть varchar2 как начало return ('привет от func1'); end func1;

Я все еще на базовом уровне, поэтому кто-нибудь может мне помочь с возвращением результата запроса select? Я полагаю, что следует использовать курсоры, так как их будет более одного ряда.

Ответы [ 3 ]

17 голосов
/ 20 января 2011

Обычно функция возвращает одну «вещь».Обычно это скаляр (число, 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 голосов
/ 22 января 2011

Ну, если вы только учитесь, вы должны знать о конвейерных функциях. Конвейерная функция позволяет вам возвращать динамически сгенерированные таблицы в 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: -)

1 голос
/ 20 января 2011

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

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

...