在程序开发中,常用到返回结果集的存储过程,这个在mysql和sql server 里比较好处理,直接返回查询结果就可以了,
但在oracle里面 要 out 出去,就多了一个步骤,对于不熟悉的兄弟们还得出上一头汗:),这里我简单介绍一下,以供参考,
   1  定义包
      oracle 返回的结果集需要自定义一个 CURSOR (游标变量)性质的变量,这个要在包头定义,所以要建立一个包,如下是包头

Pl/sql代码

CREATE OR REPLACE PACKAGE PAK_rstest

IS

TYPE   retcursor    IS   REF   CURSOR;

PROCEDURE pro_read

(

outcurse  IN OUT retcursor

);

END; -- Package spec

上面是建立了一个名称为PAK_rstest的包头,里面定义了一个CURSOR 类型,类型名为retcursor ,有了这个定义我们就可以用他来返回结果集了,比如该包里面的 pro_read 过程就是 一个返回结果集的过程,下面是他的包体,

Pl/sql代码

CREATE OR REPLACE PACKAGE BODY PAK_rstest IS

PROCEDURE pro_read

(

outcurse  IN OUT retcursor

)

IS

begin

OPEN outcurse FOR

select * from tbl_test

where rownum<6;

return;

end;

END;

这样就定义好了一个包,这个包里面有个返回结果集的过程 pro_read

2 在程序里面调用,
     下面就是如果在程序里面调用了,这里用java为例子简单介绍一下,
     假设你现在已经有一个Connection  conn 对象连接上了数据库(如何连接数据库我这里就不详细说了), 
     则用下面的代码调用过程,

Pl/sql代码

if(conn !=null){

String sqlstr = "{call  PAK_SMS2_ROUTE.MO_ISSUE(?)}";

CallableStatement cstmt = conn.prepareCall(sqlstr);

cstmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR); //outcurse

cstmt.executeUpdate();

ResultSet rs = (ResultSet) cstmt.getObject(1); // 这里吧信息已经读入rs结果集里面,剩下的大家都熟悉了吧

while (rs.next()) {

System.out.println(rs.getString("s_date1")); //tbl_test 表里的字段名称或是结果集的列名称

System.out.println(rs.getString("s_date2"));

}

conn.close();

conn = null;

}

好了到这里就可以看到返回的结果集内容了,是不是比较简单啊,:)

Oracle 存储过程返回结果集:

过程返回记录集代码

CREATE OR REPLACE PACKAGE pkg_test

AS

TYPE myrctype IS REF CURSOR;

PROCEDURE get (p_id NUMBER, p_rc OUT myrctype);

END pkg_test;

CREATE OR REPLACE PACKAGE BODY pkg_test

AS

PROCEDURE get (p_id NUMBER, p_rc OUT myrctype)

IS

sqlstr   VARCHAR2 (500);

BEGIN

IF p_id = 0 THEN

OPEN p_rc FOR

SELECT ID, NAME, sex, address, postcode, birthday

FROM student;

ELSE

sqlstr :=

'select id,name,sex,address,postcode,birthday

from student where id=:w_id';

OPEN p_rc FOR sqlstr USING p_id;

END IF;

END get;

END pkg_test;

函数返回记录集:
建立带ref cursor定义的包和包体及函数:

函数返回记录集代码

CREATE OR REPLACE

package pkg_test as

/* 定义ref cursor类型

不加return类型,为弱类型,允许动态sql查询,

否则为强类型,无法使用动态sql查询;

*/

type myrctype is ref cursor;

--函数申明

function get(intID number) return myrctype;

end pkg_test;

包体代码

CREATE OR REPLACE

package body pkg_test as

--函数体

function get(intID number) return myrctype is

rc myrctype;  --定义ref cursor变量

sqlstr varchar2(500);

begin

if intID=0 then

--静态测试,直接用select语句直接返回结果

open rc for select id,name,sex,address,postcode,birthday from

student;

else

--动态sql赋值,用:w_id来申明该变量从外部获得

sqlstr := 'select id,name,sex,address,postcode,birthday from

student where id=:w_id';

--动态测试,用sqlstr字符串返回结果,用using关键词传递参数

open rc for sqlstr using intid;

end if;

return rc;

end get;

end pkg_test;

Java调用oracle函数返回游标处理代码

CallableStatement cstmt = null;

ResultSet rs = null;

try {

String callSql = "{? = call AAAAA(?)}";

cstmt = conn.prepareCall(callSql);

cstmt.setString(2, "userName");

cstmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);

cstmt.execute();

rs = (ResultSet) cstmt.getObject(1);

if (rs != null) {

System.out.print("usercd");

System.out.print("userName");

System.out.println("EMAIL");

while (rs.next()) {

System.out.print(rs.getString(1)+"   ");

System.out.print(rs.getString(2)+"   ");

System.out.println(rs.getString(3));

}

}

oracle调用存储过程和函数返回结果集的更多相关文章

  1. Oracle在存储过程中如何返回结果集

    Oracle和Sqlserver不一样的地方有很多. 个人最深的体会是存储过程返回结果集,在Sqlserver中直接select查询就行,Oracle就不行了. 这里,就用最简单的例子说明存储过程返回 ...

  2. MyBatis调用存储过程,含有返回结果集、return参数和output参数

    Ibatis是我们经常使用的O/R映射框架,mybats是ibatis被Google收购后重新命名的一个工程,当然也做了大量的升级.而调用存储过程也是一次额C/S架构模式下经常使用的手段,我们知道,i ...

  3. java下实现调用oracle的存储过程和函数

    在Oracle下创建一个test的账户,然后 1.创建表:STOCK_PRICES --创建表格 CREATE TABLE STOCK_PRICES( RIC VARCHAR() PRIMARY KE ...

  4. oracle函数返回结果集

    一.用自定义类型实现 1.创建表对象类型. 在Oracle中想要返回表对象,必须自定义一个表类型,如下所示: create or replace type type_table is table of ...

  5. 【学习】java下实现调用oracle的存储过程和函数

    在oracle下创建一个test的账户,然后按一下步骤执行: 1.创建表:STOCK_PRICES --创建表格CREATETABLE STOCK_PRICES( RIC VARCHAR(6) PRI ...

  6. Dapper完美兼容Oracle,执行存储过程,并返回结果集。

    Dapper完美兼容Oracle,执行存储过程,并返回结果集. 这个问题,困扰了我整整两天. 刚刚用到Dapper的时候,感觉非常牛掰.特别是配合.net 4.0新特性dynamic,让我生成泛型集合 ...

  7. java servlet调用带有多个返回结果集的存储过程

    一.mysql存储过程 这里我先说下我这个功能实现的逻辑及途中遇到的一些问题.这个存储过程一共带两个输入参数,一共关联到两张表的查询,每个参数都对应查询表中的一个判断,所以一共返回了两个结果集(当然要 ...

  8. Java和Ibatis调用存储过程并取得返回值详解

    Java和Ibatis调用存储过程并取得返回值详解 2011-07-19 17:33 jiandanfeng2 CSDN博客 字号:T | T 本文主要介绍了Java和Ibatis调用存储过程的方法, ...

  9. Oracle数据库—— 存储过程与函数的创建

    一.涉及内容 1.掌握存储过程与函数的概念. 2.能够熟练创建和调用存储过程与函数. 二.具体操作 1.创建存储过程,根据职工编号删除scott.emp表中的相关记录. (1)以scott 用户连接数 ...

随机推荐

  1. Lightoj 1140(数位DP)

    求一个区间内的数含有多少个0. dp[len][pre]表示长度为len的数,含有pre个0. 需要加一个标记,来表示前缀是否为0(可以是一串连续的0),如果前缀一直为0,就一直搜,如果前缀不为0,就 ...

  2. vue 使用过程中自己遇到的bug

    需要安装npm git(windows系统需要安装) npm 是node的包管理工具 npm 国内的网站比较慢,推荐使用cnpm(淘宝的镜像) cnpm(npm) install 创建依赖-----因 ...

  3. Combo Box (组合框)控件的使用方法

    Combo Box (组合框)控件很简单,可以节省空间.从用户角度来看,这个控件是由一个文本输入控件和一个下拉菜单组成的.用户可以从一个预先定义的列表里选择一个选项,同时也可以直接在文本框里面输入文本 ...

  4. 【OpenJ_Bailian - 4152 】最佳加法表达式(动态规划)

    最佳加法表达式 Descriptions: 给定n个1到9的数字,要求在数字之间摆放m个加号(加号两边必须有数字),使得所得到的加法表达式的值最小,并输出该值.例如,在1234中摆放1个加号,最好的摆 ...

  5. 理解Javascript的闭包【转】

    什么是闭包 闭包是什么?闭包是Closure,这是静态语言所不具有的一个新特性.但是闭包也不是什么复杂到不可理解的东西,简而言之,闭包就是: 闭包就是函数的局部变量集合,只是这些局部变量在函数返回后会 ...

  6. Python生成器实现斐波那契数列

    比如,斐波那契数列:1,1,2,3,5,8,13,21,34.... 用列表生成式写不出来,但是我们可以用函数把它打印出来: def fib(number): n, a, b = 0, 0, 1 wh ...

  7. [USACO 2012 Mar Gold] Large Banner

    传送门:http://www.usaco.org/index.php?page=viewproblem2&cpid=127 又是一道这种题目,遇到一次跪一次,这次终于硬着头皮看懂了题解,但是谢 ...

  8. 学会用LATEX写论文

    记录下,方便找寻 https://www.bilibili.com/video/av18365099/

  9. java 字符串截取的几种方式

    1.split()+正则表达式来进行截取. 将正则传入split().返回的是一个字符串数组类型.不过通过这种方式截取会有很大的性能损耗,因为分析正则非常耗时. String str = " ...

  10. AJPFX:如何保证对象唯一性呢?

    思想: 1,不让其他程序创建该类对象. 2,在本类中创建一个本类对象. 3,对外提供方法,让其他程序获取这个对象. 步骤: 1,因为创建对象都需要构造函数初始化,只要将本类中的构造函数私有化,其他程序 ...