声明:本文整理自网络,加上个人实际实验结果
Oracle存储过程返回数据集,其实就是返回游标,这里需要了解这样几个概念,游标、存储过程的out参数、引用游标类型、Oracle的程序包,这里只说明具体怎么做,如果想了解以上概念请自行在网上搜索或关注我的博客。
首先说一下思路:
定义一个包(这相当于一个容器)(也可以理解为Java中的类)
包中包含一个存储过程来返回一个游标引用
包中包含一个自定义类型 游标引用(这个类型也可以应用到其它地方,这在调用存储过程时用到)
定义包分两部分:包头、包体
包头部分定义包中应该包含哪些内容(方法,存储过程等只做声明不做实现)(相当于Java中的接口)
包头部分定义:
create or replace package pkg_alen as type cursorRef is ref cursor; --定义游标引用类型 procedure query(u_id number,cursor_ref out cursorRef); --定义存储过程声明 end pkg_alen;
包体部分定义包头中的方法,存储过程等的实现(相当于Java中实现接口的类),注意必须实现包头中声明的所有方法和存储过程。
包体部分定义:
create or replace package body pkg_alen --注意这里的包名要和定义包头的包名一致 as procedure query(u_id number,cursor_ref out cursorRef) --这里的存储过程要和包头中的一致参数列表中的参数名也要一致 is begin if u_id=0 then --如果传入的id为0则查询所有数据 open cursor_ref for select id,ck_name from dm_pac_ck; else --如果传入的id为非0则查询指定id的数据 open cursor_ref for select id,ck_name from dm_pac_ck where id=u_id; --根据查询打开游标 end if; end query; end pkg_alen;
Ok,到些返回数据集的存储过程已经编写完成,这里需要注意的是:1、包头定义部分要先执行然后执行包体部分;2、cursorRef 类型为自定义类型 其原型为 ref coursor。
网上的资料很多都到此为止,但是有好多新手(也包括我在内)并不知道怎么调用,下面我就来和大家说一下怎么在SQL中调用(亲测可用)和怎么使用Java调用(未亲测)
使用SQL调用上面定义的存储过程,这里需要注意了,调用存储过程的参数和参数类型(这个困扰了我好长时间),第一个参数没什么可说的就一数字型,主要是第二个参数,这个参数的类型是pkg_alen.cursorRef,没错就是这个自定义的类型(之前我尝试了 ref cursor 和定义一个新的ref cursor类型但是都报错)
调用部分内容:
set serveroutput on; declare return_cursor pkg_alen.cursorRef; --定义接收返回数据集的变量 v_id number(4); --定义接收id的变量 uname varchar2(50); --定义接收name的变量 begin pkg_alen.query(0,return_cursor); --调用包中的存储过程返回游标引用 loop fetch return_cursor into v_id,uname; --循环获取游标中每一行的数据 exit when return_cursor%notfound; --游标结束时退出 dbms_output.put_line('id:'||v_id||' name:'||uname); --将获取到的值打印出来 end loop; --循环结束 close return_cursor; --关闭游标 end;
这里注意游标我们并没有打开只有关闭,因为游标的打开是在存储过程中完成的。
使用Java调用上面定义的存储过程:
import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; import oracle.jdbc.OracleTypes; publicclass Dao { String driver="oracle.jdbc.driver.OracleDriver"; String url="jdbc:oracle:thin:@127.0.0.1:1521:orcl"; Connection conn=null; CallableStatement cs=null; ResultSet rs; /** *获取数据连接的方法 *应该首先调用些方法来获得数据库连接 */ publicvoid getConn(){ try { Class.forName(driver); conn = DriverManager.getConnection(url, "scott", "tiger"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } /** *调用存储过程返回数据集 */ publicvoid callProcForResult(){ try { cs = conn.prepareCall("{call pkg_alen.query(?)}"); cs.registerOutParameter(1, OracleTypes.CURSOR); cs.execute(); ResultSet rs = (ResultSet)cs.getObject(1); while(rs!=null&& rs.next()){ System.out.println(new StringBuilder("ID:").append(rs.getInt(1)).append("\t Name:").append(rs.getString(2)).toString()); } } catch (SQLException e) { e.printStackTrace(); } } publicvoid closeConn(){ try { if (cs!=null) cs.close(); if(conn!=null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } publicstaticvoid main(String[] args) { Dao dao =new Dao(); dao.getConn(); //得到连接 dao.callProcForResult(); //调用返回结果集的存储过程 dao.closeConn(); //关闭连接 } }
未亲测上面的Java代码,代码来源:http://www.cnblogs.com/icerainsoft/archive/2011/08/24/2152381.html
相关推荐
存储过程中通过返回数据集,通过游标方式实现,以及在java中如何接收的整个过程
利用游标返回结果集的的例子(Oracle 存储过程).doc 利用游标返回结果集的的例子(Oracle 存储过程).doc 利用游标返回结果集的的例子(Oracle 存储过程).doc
入参是字符串格式的xml,目的是解析xml节点值,作为数据库检索where条件,检索出数据库记录,利用四个游标返回四个数据集,然后用groovy脚本将四个游标数据集解析成json出参中对应的四个节点值。出参json有两层结构...
存储过程中实现了游标的用法,并且返回一个数据集的方式。
实现的方式有多种,如编程存储过程返回游标,在存储过程中对两批数据进行比较...等等,当然返回差异数据的方式多种多样,既可以是游标,又可以临时表或其它方式。 本文主要论述利用ORACLE的MINUS函数和OVER函数,...
Oracle 11g中支持的数据类型 数据库定义语言(DDL) 约束的使用 数据操纵语言(DML) 第5章-利用SELECT检索数据 SQL-数据库沟通的语言标准 Oracle 11g中支持的数据类型 数据库定义语言(DDL) 约束的使用 ...
目录 第1章数据库简介ppt ...第17章函数与存储过程ppt 第18章数据车性能优化.ppt 第l9章数据库一致性与事务管理。ppt 第20章并发控制.ppt 第2l章Oracle在开发中的应用ppt 第22章Oracle+Hibernate应用实例.ppt
如果更改范围大到需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则您仍需要更新程序集中的代码以添加参数、更新 GetValue() 调用,等等,这时候估计比较繁琐了。 2.可移植性差 由于存储过程将应用...
《Oracle11g从入门到精通》面向数据库管理人员和数据库开发人员,从实际角度出发,系统地介绍了数据库和Oracle的相关概念和原理、Oracle的...完整案例来介绍基于Java开发包和Oracle数据库进行案例开发的详细过程...
《Oracle11g从入门到精通》面向数据库管理人员和数据库开发人员,从实际角度出发,系统地介绍了数据库和Oracle的相关概念和原理、Oracle的...完整案例来介绍基于Java开发包和Oracle数据库进行案例开发的详细过程...
程序设计,第5~9章分别介绍了Oracle11g的体系结构、表空间与数据文件的管理、启动和关闭数据库、网络服务与管理,第10—13章介绍了有关安全的几个内容(权限、角色、概要文件、用户的管理),第14—17章介绍了几种...
7.3.4 存储过程检查 7.3.5 使用触发器 7.4 避免更改引起的大量改动 7.4.1 使用视图 7.4.2 使用同义名 7.4.3 使用光标 第8章 数据库用户管理 8.1 授予权限 8.1.1 直接授权 8.1.2 授权角色 8.1.3 使用OEM的“安全管理...
7.3.4 存储过程检查 7.3.5 使用触发器 7.4 避免更改引起的大量改动 7.4.1 使用视图 7.4.2 使用同义名 7.4.3 使用光标 第8章 数据库用户管理 8.1 授予权限 8.1.1 直接授权 8.1.2 授权角色 8.1.3 使用OEM的“安全管理...
这个笔记是学习oracle数据库过程中整理出来的,比较详细,适合于初学者。 │ oracle与tomcat端口冲突.txt │ Oracle学习笔记.pdf │ Oracle学习笔记.wps │ 安装Oracle后myEclipse不能正常使用.txt │ 手工配置...
他的关注方向包括Oracle产品集,以及其他前沿技术和这些技术在优化数据仓库设计和部署的应用。他还是各种技术会议的主讲人,包括COLLABORATE、Oracle OpenWorld和其他地方与区域会议。 Michael Abbey是公认的...
该部分通过变量赋值、流程控制、数据查询、数据操纵、数据定义、事务控制、游标处理等实现块的功能。 异常处理部分:以关键字EXCEPTION开始,END结束。该部分用于处理该块执行过程中产生的异常。 8. 说明触发器的...
5.7 如何创建存储过程以及创建存储过程的原因 5.8 函数的创建和使用 5.9 调用PL/SQL程序 5.10 本章 测验 第6章 数据库管理员 6.1 了解DBA的工作 6.2 执行日常操作 6.2.1 体系结构和设计 6.2.2 容量规划 6.2.3 备份...
其三、职业方向多:Oracle数据库管理方向、Oracle开发及系统架构方向、Oracle数据建模数据仓库等方向。 四、 如何学习 认真听课、多思考问题、多动手操作、有问题一定要问、多参与讨论、多帮组同学 五、 体系结构 ...
利用游标 REF CURSOR 可将数据集(多行记录)传递到PL/SQL函数: SELECT * FROM TABLE (myfunction (CURSOR (SELECT * FROM mytab))); 2. 利用两个实体化视图(或表)作为样板数据 CREATE MATERIALIZED VIEW ...
(2)替换符 (用来临时存储有关的数据) 46 5.帮助命令 46 (1)help index 将显示SQL*Plus的所有命令 47 (2)help 命令名称 显示该命令的功能和选项 47 6.其他的SQL*Plus命令 47 (1)退出 SQL> Exit | Quit; 47 ...