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 = a and col2 = b) loop
v := row_type(thisrow.a, thisrow.b);
pipe row(v);
end loop;
return;
end;
select * from table(test_fun('', ''));
转自 http://blog.csdn.net/feiliu010/article/details/1538822
Oracle中函数/过程返回多个值(结果集)的更多相关文章
- Oracle中函数/过程返回结果集的几种方式
原文 Oracle中函数/过程返回结果集的几种方式 Oracle中函数/过程返回结果集的几种方式: 以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过. ...
- Oracle中函数如何返回结果集
在Oracle中,用函数返回结果集有时候要用到,下面是demo: 1 2 3 4 5 6 7 create or replace type t_test as object ( id integer, ...
- python中函数的返回值
函数返回值(一) <1>“返回值”介绍 现实生活中的场景: 我给儿子10块钱,让他给我买包烟.这个例子中,10块钱是我给儿子的,就相当于调用函数时传递到参数,让儿子买烟这个事情最终的目标是 ...
- C++中函数的返回值
原文 [ 函数的返回值用于初始化在调用函数处创建的临时对象.在求解表达式时,如果需要一个地方储存其运算结果,编译器会创建一个没有命名的对象,这就是 临时对象.temporary object ] -- ...
- oracle中函数和存储过程的区别和联系【转载竹沥半夏】
oracle中函数和存储过程的区别和联系[转载竹沥半夏] 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己 ...
- oracle中函数和存储过程的区别和联系
oracle中函数和存储过程的区别和联系 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己总结的关于函数和 ...
- java 一个函数EnumMap返回多个值
java 一个函数如何返回多个值 在开发过程中,经常会有这种情况,就是一个函数需要返回多个值,这是一个问题!! 网上这个问题的解决方法: 1.使用map返回值:这个方法问题是,你并不知道如何返回值 ...
- Oracle常用函数:DateDiff() 返回两个日期之间的时间间隔自定义函数
首先在oracle中没有datediff()函数可以用以下方法在oracle中实现该函数的功能:1.利用日期间的加减运算天:ROUND(TO_NUMBER(END_DATE - START_DATE) ...
- java 一个函数如何返回多个值
在开发过程中,经常会有这种情况,就是一个函数需要返回多个值,这是一个问题!! 网上这个问题的解决方法: 1.使用map返回值:这个方法问题是,你并不知道如何返回值的key是什么,只能通过doc或者通过 ...
随机推荐
- Html.Raw用法
比如有个字符串是这样的<font color='red'>红字</font> 如果是用@Html.Raw('<font color='red'>红字</fon ...
- 北大poj-1021
2D-Nim Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4066 Accepted: 1851 Descriptio ...
- Java学习笔记(5)
齿状二维数组的声明及使用 或者 int[][] triangleArray = new int[5][]; triangleArray[0] = new int[5]; triangleArray[1 ...
- v-echart 按需加载
import 'v-charts/lib/style.css';import VeBar from 'v-charts/lib/bar' // 条形图import VeRadar from 'v-ch ...
- linux下crontab定时执行shell脚本调用oracle 存储过程
问题:脚本内调用存储过程,脚本直接执行没问题,使用crontab 执行脚本存储过程未执行 原因:缺少oracle环境变量 解决:在shell脚本里添加oracle的环境变量 #!/bin/sh PAT ...
- mybatis 源码分析二
1.SqlSession下的四大对象 Executor.StatementHandler.ParameterHandler.ResultSetHandler StatementHandler的作用是使 ...
- spring+mybatis的多源数据库配置实战
前言: 关于spring+mybatis的多源数据库配置, 其实是个老生常谈的事情. 网上的方案出奇的一致, 都是借助AbstractRoutingDataSource进行动态数据源的切换. 这边再无 ...
- webpack基本配置
module: { rules: [ { test: /\.css$/, use: ['style-loader','css-loader?minimize'] } ] } 一.入门 loader可以 ...
- ODI Scenario 场景
ODI中,场景的作用类似发布版本,当映射最终修改版完成时,可以生成场景.无论是映射(Mapping)还是包(Package)都可以生成场景. 包调用映射和调用场景的区别: 1,包直接调用映射,当映射修 ...
- Oracle数据库:ORA-54013错误解决办法
ORA-54013: 不允许对虚拟列执行 INSERT 操作 这是Oracle 11 的新特性 —— 虚拟列. 在以前的Oracle 版本,当我们需要使用表达式或者一些计算公式时,我们会创建数据库视图 ...