博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle中函数/过程返回多个值(结果集)
阅读量:5340 次
发布时间:2019-06-15

本文共 2609 字,大约阅读时间需要 8 分钟。

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    <
> 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 = 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', '456'));

转自 http://blog.csdn.net/feiliu010/article/details/1538822

转载于:https://www.cnblogs.com/zheng-hong-bo/p/4563845.html

你可能感兴趣的文章
本地MongoDB服务开启与连接本地以及远程服务器MongoDB服务
查看>>
跨域解决方案之CORS
查看>>
学习RESTFul架构
查看>>
分析语句执行步骤并对排出耗时比较多的语句
查看>>
原生JS轮播-各种效果的极简实现
查看>>
软件工程总结作业---提问回顾与个人总结
查看>>
计数器方法使用?
查看>>
带你全面了解高级 Java 面试中需要掌握的 JVM 知识点
查看>>
sonar结合jenkins
查看>>
解决VS+QT无法生成moc文件的问题
查看>>
AngularJs练习Demo14自定义服务
查看>>
stat filename
查看>>
关于空想X
查看>>
CF1067C Knights 构造
查看>>
[BZOJ2938] 病毒
查看>>
webstorm修改文件,webpack-dev-server不会自动编译刷新
查看>>
Scikit-learn 库的使用
查看>>
CSS: caption-side 属性
查看>>
python 用数组实现队列
查看>>
认证和授权(Authentication和Authorization)
查看>>