日期:2014-05-17  浏览次数:21280 次

oracle function是否支持返回多个值
我想在一个function中返回多个不同的数据,欢迎大家回帖,最后有可以跑的代码
------最佳解决方案--------------------
你可以在function 里把想返回的值写入一个表中,或者直接返回类型定义为表类型,就可以返回好多值了
1、创建表对象类型。
在Oracle中想要返回表对象,必须自定义一个表类型,如下所示:
create or replace type t_table is table of number;
上面的类型定义好后,在function使用可用返回一列的表,如果需要多列的话,需要先定义一个对象类型。然后把对象类型替换上面语句中的number;
定义对象类型:
create or replace type obj_table as object
(
  id int,
  name varchar2(50)
)
修改表对象类型的定义语句如下:
create or replace type t_table is table of obj_table; 
2、 创建演示函数
在函数的定义中,可以使用管道化表函数和普通的方式,下面提供两种使用方式的代码:
1)、管道化表函数方式:
create or replace function f_pipe(s number)
return t_table pipelined
as
    v_obj_table obj_table;   
begin    
for i in 1..s loop 
    v_obj_table :=  obj_table(i,to_char(i*i));
    pipe   row(v_obj_table);   
end loop;
return;
end f_pipe;
注意:管道的方式必须使用空的return表示结束.
调用函数的方式如下:
select * from table(f_pipe(5)); 
2)、 普通的方式:
create or replace function f_normal(s number)
return t_table
as
    rs t_table:= t_table();
begin
    for i in 1..s loop
        rs.extend;
        rs(rs.count) := obj_table(rs.count,'name'
------其他解决方案--------------------
如果想返回多个,那么定义type。不过,这时违背了function的初衷,考虑是不是设计上有些环节不优化
------其他解决方案--------------------
用存储过程,函数只有一个返回值。
------其他解决方案--------------------
to_char(rs.count));
        --rs(rs.count).name := rs(rs.count).name 
------其他解决方案--------------------
 'xxxx';
    end loop;
return rs;
end f_normal;
初始化值后还可以想注视行那样进行修改.
调用方式如下:

select * from table(f_normal(5));
------其他解决方案--------------------
函数只能返回一个值,这个值可一个是个TYPE类似于程序中的类,还可以通过参数输出需要的值,没必要非通过返回吧