Oracle:在函数中返回多个值

时间:2012-05-31 21:17:51

标签: sql oracle function plsql views

我正在尝试使用两个表(员工和部门)从函数返回%rowtype中的多个值,但它对我不起作用。

create or replace function get_employee
 (loc in number)
return mv_emp%rowtype
as  
   emp_record mv_emp%rowtype;
begin
   select a.first_name, a.last_name, b.department_name into emp_record 
   from employees a, departments b 
   where a.department_id=b.department_id and location_id=loc;

   return(emp_record);  
end;

3 个答案:

答案 0 :(得分:8)

上面编译的函数没有任何错误? MV_EMP的类型是什么?理想情况下,它应该是下面的内容。

create or replace type emp_type
(
first_name varchar2(20)
, last_name varchar2(20)
, depart_name varchar2(20)
)
/
create or replace function get_employee
 (loc in number)
return emp_type
as  
   emp_record emp_type;
begin
   select a.first_name, a.last_name, b.department_name into emp_record 
   from employees a, departments b 
   where a.department_id=b.department_id and location_id=loc;

   return(emp_record);  
end;

答案 1 :(得分:1)

create type t_row as object (a varchar2(10));

create type t_row_tab as table of t_row;

我们现在将创建一个将输入字符串分开的函数。

create or replace function get_number(pv_no_list in varchar2) return t_row_tab is
lv_no_list t_row_tab := t_row_tab();
begin

  for i in (SELECT distinct REGEXP_SUBSTR(pv_no_list, '[^,]+', 1, LEVEL) no_list FROM dual
  CONNECT BY REGEXP_SUBSTR(pv_no_list, '[^,]+', 1, LEVEL) IS NOT NULL)
  loop
  lv_no_list.extend;
  lv_no_list(lv_no_list.last) := t_row(i.no_list);
  end loop;

  return lv_no_list;

end get_number;

一旦函数到位,我们就可以使用sql语句的table子句来获得所需的结果。根据需要,我们从函数返回了多个值。

SQL> select * from table(get_number('1,2,3,4'));


A
----------
1
3
2
4

所以现在我们的功能就像表格一样。可能存在这样的情况:您希望这些逗号分隔值成为“IN”子句的一部分。

例如:

select * from dummy_table where dummy_column in ('1,2,3,4');

但上述查询不起作用,因为'1,2,3,4'是一个字符串而不是单个数字。要解决此问题,您只需使用以下查询。

select * from dummy_table where dummy_column in ( select * from table(get_number('1,2,3,4')) );

参考文献:http://www.oraclebin.com/2012/12/returning-multiple-values-from-function.html

答案 2 :(得分:0)

CREATE OR replace FUNCTION Funmultiple(deptno_in IN NUMBER)
  RETURN NUMBER AS v_refcursur SYS_REFCURSOR;
  BEGIN
    OPEN v_refcursor FOR
    SELECT *
    FROM   emp
    WHERE  deptno = deptno_in;
    
    retun v_refcursor;
  END;

要调用它,请使用:

variable x number
exec :x := FunMultiple(10);
print x