我正在尝试使用两个表(员工和部门)从函数返回%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;
答案 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