Oracle中函数/过程返回结果集的几种方式

前端之家收集整理的这篇文章主要介绍了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类型的结果集:

首先定义一个行类型:

CREATEORREPLACETYPE"SPLIT_ARR"ASOBJECT(nowStrvarchar2(18))

其次以此行类型定义一个表类型:

CREATETYPE"SPLIT_TAB"TABLEofsplit_arr;

定义函数(此函数完成字符串拆分功能):

FUNCTION GetSubStr( str in varchar2,--待分割的字符串 splitchar varchar2 分割标志 ) return split_tab IS restStr varchar2(2000) default GetSubStr.str;剩余的字符串 thisStr 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; 1 -第一个字符便为分隔符,此时去掉分隔符 begin restStr := substr(restStr,2); goto top; if length(restStr) or restStr is null then return v; if; v.extend; thisStr :1,indexStr - 1); 取得当前的字符串 restStr :+ 1);-取剩余的字符串 v(v.= split_arr(thisStr); END LOOP; return v; end;

在PL/sql developer中可以直接调用

cursorstrcuris

  selectnowStrfromTable(GetSubStr('111,222,333,',',0)">));

(3)以管道形式输出:

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

猜你在找的Oracle相关文章