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