码迷,mamicode.com
首页 > 数据库 > 详细

oracle函数返回一个变量包含多个属性

时间:2016-04-29 15:58:43      阅读:258      评论:0      收藏:0      [点我收藏+]

标签:

Oracle中函数/过程返回结果集的3种方式,现总结如下:
    以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过.
    (1) 返回游标:
        return的类型为:SYS_REFCURSOR
        之后在IS里面定义变量:curr SYS_REFCURSOR;
        最后在函数体中写:
         open cur for
            select ......;
         return cur;
        例:
      
技术分享CREATEOR REPLACEFUNCTION A_Test(
技术分享                orType
varchar2
技术分享        )
RETURN SYS_REFCURSOR
技术分享       
is
技术分享               type_cur SYS_REFCURSOR;
技术分享       
BEGIN
技术分享           
OPEN type_curFOR
技术分享                   
select col1,col2,col3from testTable ;
技术分享                 
RETURN  type_cur;
技术分享       
END;

    (2)返回table类型的结果集:
        首先定义一个行类型:
          
技术分享CREATEOR REPLACE TYPE "SPLIT_ARR" AS OBJECT(nowStrvarchar2(18))

        其次以此行类型定义一个表类型:
        
技术分享 CREATE OR REPLACE TYPE "SPLIT_TAB"AS TABLEof split_arr;

        定义函数(此函数完成字符串拆分功能):
          
技术分享CREATEOR REPLACEFUNCTION GetSubStr(
技术分享                  
str invarchar2,--待分割的字符串
技术分享
                   splitcharin varchar2--分割标志
技术分享
            )
技术分享           
return split_tab
技术分享           
IS
技术分享              restStr
varchar2(2000)default GetSubStr.str;--剩余的字符串
技术分享
              thisStrvarchar2(18);--取得的当前字符串
技术分享
              indexStrint;--临时存放分隔符在字符串中的位置
技术分享
            
技术分享              v split_tab :
= split_tab();--返回结果
技术分享

技术分享           
begin
技术分享                 dbms_output.put_line(restStr);
技术分享                
while length(restStr)!= 0
技术分享                   LOOP
技术分享                    
<<top>>
技术分享                     indexStr :
= instr(restStr,splitchar);--从子串中取分隔符的第一个位置
技术分享

技术分享                    
if indexStr = 0and length(restStr)!= 0 then--在剩余的串中找不到分隔符
技术分享
                       begin
技术分享                          v.extend;
技术分享                          v(v.
count) := split_arr(Reststr);
技术分享                         
return v;
技术分享                       
end;
技术分享                    
end if;
技术分享                   
技术分享                    
if indexStr = 1then---第一个字符便为分隔符,此时去掉分隔符
技术分享
                       begin
技术分享                             restStr :
= substr(restStr,2);
技术分享                            
goto   top;
技术分享                       
end;
技术分享                    
end if;
技术分享                   
技术分享                    
if length(restStr)= 0or restStr is nullthen
技术分享                       
return v;
技术分享                    
end if;
技术分享                  
技术分享                     v.extend;
技术分享                     thisStr :
= substr(restStr,1,indexStr- 1);--取得当前的字符串
技术分享
                     restStr := substr(restStr,indexStr+ 1);---取剩余的字符串
技术分享

技术分享                     v(v.
count) := split_arr(thisStr);
技术分享                  
END LOOP;
技术分享                
return v;
技术分享           
end;

        在PL/SQL developer中可以直接调用
         
技术分享cursor strcuris
技术分享                        
select nowStrfrom Table(GetSubStr(111,222,333,,,,,));

    (3)以管道形式输出:
      
技术分享create type row_typeas object(a varchar2(10), vvarchar2(10));--定义行对象
技术分享
       create type table_typeas tableof row_type; --定义表对象
技术分享
       create or replacefunction test_fun(
技术分享            a
in varchar2,bin varchar2
技术分享        )
技术分享       
return table_type pipelined
技术分享       
is
技术分享            v row_type;
--定义v为行对象类型
技术分享
       begin
技术分享         
for thisrow in (select a, bfrom mytable where col1=aand col2 = b) loop
技术分享            v :
= row_type(thisrow.a, thisrow.b);
技术分享           
pipe row (v);
技术分享         
end loop;
技术分享         
return;
技术分享       
end;
技术分享       
select * fromtable(test_fun(123,456));

oracle函数返回一个变量包含多个属性

标签:

原文地址:http://blog.csdn.net/yanyu529584640/article/details/51271868

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!