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(‘123‘, ‘456‘));

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

时间: 2024-10-27 04:04:34

Oracle中函数/过程返回多个值(结果集)的相关文章

Oracle中函数如何返回结果集

在Oracle中,用函数返回结果集有时候要用到,下面是demo: 1 2 3 4 5 6 7 create or replace type t_test as object ( id integer, create_time date, object_name varchar2(60) ); create or replace type t_test_table as table of t_test; 1.用数组的方式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

oracle中函数和存储过程的区别和联系【转载竹沥半夏】

oracle中函数和存储过程的区别和联系[转载竹沥半夏] 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己总结的关于函数和存储过程的区别. 一.存储过程 1.定义 存储过程是存储在数据库中提供所有用户程序调用的子程序,定义存储过程的关键字为procedure. 2.创建存储过程 create [or replace] procedure 存储过程名 [(参数1 类型,参数2 out 类型……)] as

oracle中函数和存储过程的区别和联系

oracle中函数和存储过程的区别和联系 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己总结的关于函数和存储过程的区别. 一.存储过程 1.定义 存储过程是存储在数据库中提供所有用户程序调用的子程序,定义存储过程的关键字为procedure. 2.创建存储过程 create [or replace] procedure 存储过程名 [(参数1 类型,参数2 out 类型……)] as 变量名 类型:

java 一个函数EnumMap返回多个值

java 一个函数如何返回多个值 在开发过程中,经常会有这种情况,就是一个函数需要返回多个值,这是一个问题!! 网上这个问题的解决方法: 1.使用map返回值:这个方法问题是,你并不知道如何返回值的key是什么,只能通过doc或者通过源代码来查看. 2.传入一个引用进去,修改引用的属性值.问题:不实用. 3.通过泛型构造一个类似python的tuple类,或者构造一个JavaBean,其问题都是“一次性”,觉的不优雅. 个人解决方案: 使用EnumMap作为返回值类型,自己定义一个enum,将可

java 一个函数如何返回多个值

在开发过程中,经常会有这种情况,就是一个函数需要返回多个值,这是一个问题!! 网上这个问题的解决方法: 1.使用map返回值:这个方法问题是,你并不知道如何返回值的key是什么,只能通过doc或者通过源代码来查看. 2.传入一个引用进去,修改引用的属性值.问题:不实用. 3.通过泛型构造一个类似python的tuple类,或者构造一个JavaBean,其问题都是"一次性",觉的不优雅. 个人解决方案: 使用EnumMap作为返回值类型,自己定义一个enum,将可能返回的属性名定义为en

关于 Shell中函数的返回值 问题

# !/bin/sh sum() { echo $(($1+$2)) return $(($1-$2)) } sum $1 $2 c=$(sum $1 $2) echo $? echo $c 执行命令:./bashTest 11 1 运行结果是: 12 -- sum $1 $2的结果 10 -- echo $?的结果,因为return的值为10 12 --  echo $c的结果,值为12,所以c并不会被附上return的值,echo $c时调用了sum函数,所以打印了12 我们对shell中的

ctypes获取扩展模块中函数的返回值

ctypes获取返回值 我们前面已经看到了,通过ctypes像扩展模块中的函数传参时是没有问题的,但是我们如何拿到返回值呢?我们之前都是使用printf直接打印的,但是这样显然不行,我们肯定是要拿到返回值去做一些别的事情的.那么我们看看如何使用ctypes获取函数的返回值. 获取整型返回值 int test1(int a, int b) { int c; c = a + b; return c; } void test2() { } 我们定义了两个函数,下面编译成dll文件,dll文件名叫做mm

oracle中函数

一:前言 最近决定每天都把知识点总结下,然后每个星期把知识点在进行分类发表日志. 二:The Question (1):在oracle中进行年龄的计算,知道出生日期进行计算后截取,本来是一个很简单的函数,但是我觉得对于这些东西真的是用多了自己就记住了所以我还是记载下来,不然我每次都要进行查找,还是很麻烦的. 计算年龄的函数: Trunc((sysdate-CSRQ)/365,0) as nl这个函数的形式:Trunc(number,decimals);该函数是返回处理后的值.和ROUND相似,但

C函数实现返回多个值的方法

C语言中,一个函数最多只能实现一个返回值. [cpp] view plain copy int func (int b) { int a=5; if (a>b) return a; else return b; return  0; } 通过在函数中使用返回语句,返回一个值给函数,同时终止函数的调用,返回主函数. 而在实际操作过程中,我们需要调用一个函数,实现得出几个不同结果的情况. (1)函数返回一个数组,然后再解析数组中的每个数值的意思. (2)指针作为参数,承载所要输出的值. [cpp]