Oracle中过程/函数返回结果集

Oracle中函数/过程返回结果集的几种方式:
    以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过.
    (1) 返回游标:
        return的类型为:SYS_REFCURSOR
        之后在IS里面定义变量:curr SYS_REFCURSOR;
        最后在函数体中写:
         open cur for
            select ......;
         return cur;
        例:
       
CREATE   OR   REPLACE   FUNCTION  A_Test(
                orType 
varchar2
        )
RETURN  SYS_REFCURSOR
        
is
               type_cur SYS_REFCURSOR;
        
BEGIN
            
OPEN  type_cur  FOR
                    
select  col1,col2,col3  from  testTable ;
                  
RETURN   type_cur;
        
END ;

    (2)返回table类型的结果集:
        首先定义一个行类型:
           
CREATE   OR   REPLACE  TYPE "SPLIT_ARR"   AS  OBJECT(nowStr  varchar2 ( 18 ))

        其次以此行类型定义一个表类型:
         
   CREATE   OR   REPLACE  TYPE "SPLIT_TAB"  AS   TABLE   of  split_arr;

        定义函数(此函数完成字符串拆分功能):
           
CREATE   OR   REPLACE   FUNCTION  GetSubStr(
                   
str   in   varchar2 -- 待分割的字符串
                   splitchar  in   varchar2   -- 分割标志
            )
            
return  split_tab
            
IS
              restStr 
varchar2 ( 2000 default  GetSubStr. str ; -- 剩余的字符串
              thisStr  varchar2 ( 18 ); -- 取得的当前字符串
              indexStr  int ; -- 临时存放分隔符在字符串中的位置
             
              v split_tab :
=  split_tab();  -- 返回结果

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

                     
if  indexStr  =   0   and  length(restStr)  !=   0    then -- 在剩余的串中找不到分隔符
                         begin
                          v.extend;
                          v(v.
count ) : =  split_arr(Reststr);
                          
return  v;
                        
end ;
                     
end   if ;
                    
                     
if  indexStr  =   1   then -- -第一个字符便为分隔符,此时去掉分隔符
                         begin
                             restStr :
=  substr(restStr, 2 );
                             
goto     top ;
                        
end ;
                     
end   if ;
                    
                     
if  length(restStr)  =   0   or  restStr  is   null   then
                        
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  strcur  is
                         
select  nowStr  from   Table (GetSubStr( ' 111,222,333,,, ' , ' , ' ));

    (3)以管道形式输出:
       
create  type row_type  as  object(a  varchar2 ( 10 ), v  varchar2 ( 10 )); -- 定义行对象
         create  type table_type  as   table   of  row_type;  -- 定义表对象
         create   or   replace   function  test_fun(
            a 
in   varchar2 ,b  in   varchar2
        )
        
return  table_type pipelined
        
is
            v row_type;
-- 定义v为行对象类型
         begin
          
for  thisrow  in  ( select  a, b  from  mytable  where  col1 = and  col2  =  b) loop
            v :
=  row_type(thisrow.a, thisrow.b);
            
pipe  row (v);
          
end  loop;
          
return ;
        
end ;
        
select   *   from   table (test_fun( ' 123 ' , ' 456 ' ));




 
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值