Вернуть 2 значения из функции PL-SQL - PullRequest
4 голосов
/ 17 августа 2010

Как я могу вернуть 2 значения из функции PL-SQL?

Ответы [ 5 ]

13 голосов
/ 17 августа 2010

Я бы не рекомендовал создавать функцию с параметром OUT для второго значения, потому что мне нравится думать о функциях как о чистой концепции: функция выполняет операцию с одним или несколькими входами для получения one выход.Он не должен изменять ни один из своих аргументов или иметь какие-либо другие «побочные эффекты».

Поэтому, если вам нужно два вывода, вместо этого напишите процедуру :

procedure get_sqrt_and_half
   ( p_input number
   , p_sqrt OUT number
   , p_half OUT number
   )
is
begin
   p_sqrt := sqrt(p_input);
   p_half := p_input/2;
end;
6 голосов
/ 18 августа 2010

Функция может возвращать только один тип SQL, но это может быть пользовательский тип с несколькими значениями.Мне нужно знать больше о фактических конечных требованиях, прежде чем я рекомендую это как решение, но это возможно.

4 голосов
/ 17 августа 2010

Вы можете вернуть одно значение напрямую, а другое - в качестве параметра OUT. Или вы возвращаете запись, которая содержит оба значения. Первый вариант в большинстве случаев проще сделать.

1 голос
/ 09 апреля 2015
**If you are wanting to use it in SQL, then you would need a pipelined function e.g.**

CREATE OR REPLACE TYPE myemp AS OBJECT
 ( empno    number,
   ename    varchar2(10),
   job      varchar2(10),
   mgr      number,
   hiredate date,
   sal      number,
   comm     number,
   deptno   number
 );

 CREATE OR REPLACE TYPE myrectable AS TABLE OF myemp ;


    enter code here

CREATE OR REPLACE FUNCTION pipedata(p_min_row number, p_max_row number) RETURN myrectable PIPELINED IS
    v_obj myemp := myemp(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
 BEGIN
   FOR e IN (select *
             from (
                   select e.*
                         ,rownum rn
                   from (select * from emp order by empno) e
                  )
             where rn between p_min_row and p_max_row)
   LOOP
     v_obj.empno    := e.empno;
     v_obj.ename    := e.ename;
     v_obj.job      := e.job;
     v_obj.mgr      := e.mgr;
     v_obj.hiredate := e.hiredate;
     v_obj.sal      := e.sal;
     v_obj.comm     := e.comm;
     v_obj.deptno   := e.deptno;
     PIPE ROW (v_obj);
   END LOOP;
   RETURN;
 END;

SQL> select * from table(pipedata(1,5));
0 голосов
/ 17 августа 2010

Попробуйте использовать OUT параметры:

create or replace function f(a IN NUMBER, b OUT NUMBER) RETURN NUMBER IS
BEGIN
  b := a;
  RETURN a;
END f;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...