Oracle 函数 return table

Oracle function return table

我不知道什么是解决我的问题的最佳方法。我需要一个参数为

的函数
VAL
-----
1
2
3

在函数中,我需要将 union all 放在一起以获得所有值。

Select column_1 as VAL from my_table where id = P_FUNCTION_PARAMETER --return 1
union all
Select column_2 as VAL from my_table where id = P_FUNCTION_PARAMETER --return 2
union all
Select column_3 as VAL from my_table where id = P_FUNCTION_PARAMETER; --return 3

最好的解决方案是什么?

“最佳”仅取决于。 Return 引用游标或集合,随你喜欢。

例如:

SQL> create or replace function f_test_rc
  2    return sys_refcursor
  3  is
  4    rc sys_refcursor;
  5  begin
  6    open rc for
  7      select 1 from dual union all
  8      select 2 from dual union all
  9      select 3 from dual;
 10
 11    return rc;
 12  end;
 13  /

Function created.

SQL> select f_test_rc from dual;

F_TEST_RC
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

         1
----------
         1
         2
         3

SQL> create or replace function f_test_coll
  2    return  sys.odcinumberlist
  3  as
  4    l_coll  sys.odcinumberlist;
  5  begin
  6    select * bulk collect into l_coll
  7    from (select 1 from dual union all
  8          select 2 from dual union all
  9          select 3 from dual
 10         );
 11
 12    return l_coll;
 13  end;
 14  /

Function created.

SQL> select * from table(f_test_coll);

COLUMN_VALUE
------------
           1
           2
           3

SQL>

首先让我们设置一个小的 table 进行测试:

create table my_table
( id       number primary key
, column_1 number
, column_2 number
, column_3 number
);

insert into my_table
  select 1008, 3,   -8,  0.2  from dual union all
  select 1002, 6, null, -1.2 from dual
;
commit;

该函数可能如下所示。请注意,我不使用 union all - 这将需要阅读 table 三次,而只有一次就足够了。

create or replace function my_function (p_function_parameter number)
  return sys.odcinumberlist
as
  arr sys.odcinumberlist;
begin
  select case ord when 1 then column_1
                  when 2 then column_2
                  when 3 then column_3 end
  bulk   collect into arr
  from   my_table cross join
         (select level as ord from dual connect by level <= 3)
  where  id = p_function_parameter
  order  by ord
  ;
  
  return arr;
end;
/

函数可以这样使用,例如:(在旧版本中,您可能需要将函数调用包装在 table 运算符中)

select * from my_function(1002);

COLUMN_VALUE
------------
           6

        -1.2