这里使用Oracle数据库的thin连接。

下面是存储过程SQL

 1 createorreplaceprocedure proc3(stid in student.stuid%type, stname out student.sname%type, stphone out student.phonenumber%type, stuadd out student.saddress%type)
2 as countnumber number;
3 begin
4 selectcount(*) into countnumber from student where stuid=stid;
5 if countnumber=1then
6 select phonenumber into stphone from student where stuid=stid;
7 select saddress into stuadd from student where stuid=stid;
8 select sname into stname from student where stuid=stid;
9 else
10 dbms_output.put_line('返回值过多');
11 endif;
12 end;

调用存储过程时,要用CallabelStatement的prepareCall 方法。结构:{call 存储过程名(?,?,...)}

在设置参数的时候,输入参数用set,输出参数要registerOutParameter。取出输出参数的值可以直接用CallabelStatement的get方法

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types; public class Dao { String driver="oracle.jdbc.driver.OracleDriver";
String url="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
Connection conn=null;
CallableStatement cs=null;//PreparedStatement,Statement
ResultSet rs; public void getConn(){
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, "scott", "tiger");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} }
public void callProc(){
try {
cs = conn.prepareCall("{call proc3(?,?,?,?)}");
cs.setInt(1, 1);
cs.registerOutParameter(2, Types.VARCHAR);
cs.registerOutParameter(3, Types.VARCHAR);
cs.registerOutParameter(4, Types.VARCHAR);
cs.execute();
String name = cs.getString(2);
String phone = cs.getString(3);
String address = cs.getString(4);
System.out.println("Name:"+name+"\t Phone:"+phone+"\t Address:"+address);
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if (cs!=null) cs.close();
if(conn!=null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Dao dao = new Dao();
dao.getConn();
dao.callProc();
}
}

以上方法只支持返回个别数据的,不能像SQL返回结果集类型那样。其实,Oracle并不能直接用存储过程来返回结果集,需要借用包才能实现。看代码:

1 CREATEORREPLACE PACKAGE mypack IS
2 TYPE mycursor IS REF CURSOR;
3 PROCEDURE myproc(outcursor IN OUT mycursor);
4 END mypack;

这里建了一个包,其中有两个元素:mycursor游标和myproc存储过程。执行该语句之后要再定义这个包中的内容,代码如下:

 1 CREATEORREPLACE PACKAGE BODY mypack IS
2 PROCEDURE myproc(
3 outcursor IN OUT mycursor
4 )
5 IS
6 BEGIN
7 OPEN outcursor FOR
8 SELECT*FROM Student WHERE ROWNUM<10;
9 RETURN;
10 END myproc;
11 END;

这里详细定义了mycursor和myproc的body。注意:CREATE PACKAGE和CREATE PACKAGE BODY不能一起执行,必须先后执行,否则会报错(用goto;连接是可以的)。OKay,包和存储过程定义好了,该写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;//PreparedStatement,Statement
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 callProc(){
try {
cs = conn.prepareCall("{call proc3(?,?,?,?)}");
cs.setInt(1, 1);
cs.registerOutParameter(2, Types.VARCHAR);
cs.registerOutParameter(3, Types.VARCHAR);
cs.registerOutParameter(4, Types.VARCHAR);
cs.execute();
String name = cs.getString(2);
String phone = cs.getString(3);
String address = cs.getString(4);
System.out.println("Name:"+name+"\t Phone:"+phone+"\t Address:"+address);
} catch (SQLException e) {
e.printStackTrace();
}
}
publicvoid callProcForResult(){
try {
cs = conn.prepareCall("{call mypack.myproc(?)}");
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))
.append("\t Phone:").append(rs.getString(6)).append("\t Address:").append(rs.getString(7)).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.callProc(); //调用返回单属性的存储过程
dao.callProcForResult(); //调用返回结果集的存储过程
dao.closeConn(); //关闭连接
}
}

Java 调用存储过程 返回结果集的更多相关文章

  1. PostgreSQL 调用存储过程返回结果集

    创建返回结果集类型的存储过程: CREATE OR REPLACE FUNCTION public.f_get_member_info( id integer, productname charact ...

  2. myabatis oracle 调用存储过程返回list结果集

    Mapper.xml 配置 <resultMap type="emp" id="empMap"> <id property="emp ...

  3. PB中用oracle的存储过程返回记录集做数据源来生成数据窗口,PB会找不到此存储过程及不能正常识别存储过程的参数问题(转)

    (转)在PB中用oracle的存储过程返回记录集做数据源来生成数据窗口 首先oracle的存储过程写法与MSSQL不一样,差别比较大. 如果是返回数据集的存储过程则需要利用oracle的包来定义游标. ...

  4. oracle 存储过程返回结果集 (转载)

    好久没上来了, 难道今天工作时间稍有空闲, 研究了一下oracle存储过程返回结果集. 配合oracle临时表, 使用存储过程来返回结果集的数据读取方式可以解决海量数据表与其他表的连接问题. 在存储过 ...

  5. clob字段的值插入和查询N种方法【包括java调用存储过程传入clob参数】

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import jav ...

  6. Oracle数据库基本操作 (五) —— 使用java调用存储过程

    一.环境准备 登录Oracle数据库scott账号,利用emp进行操作. 1.创建 proc_getyearsal 存储过程 -- 获取指定员工年薪 create or replace procedu ...

  7. oracle 存储过程 返回结果集

      oracle 存储过程 返回结果集 CreationTime--2018年8月14日09点50分 Author:Marydon 1.情景展示 oracle存储过程如何返回结果集 2.解决方案 最简 ...

  8. oracle 存储过程返回结果集

    好久没上来了, 难道今天工作时间稍有空闲, 研究了一下oracle存储过程返回结果集. 配合oracle临时表, 使用存储过程来返回结果集的数据读取方式可以解决海量数据表与其他表的连接问题. 在存储过 ...

  9. java调用存储过程(stored procedures)的HelloWorld例子

    1.java调用存储过程(stored procedures)的HelloWorld程序 有点数据 库基础的人都知道.存储过程(stored procedures)和java没什么关系.它是一段纯粹的 ...

随机推荐

  1. #!/usr/bin/env ruby 与 #!/usr/bin/ruby 的区别(copy)

    [说明:资料来自http://blog.csdn.net/wh_19910525/article/details/8040494] 脚本语言的第一行,目的就是指出,你想要你的这个文件中的代码用什么可执 ...

  2. bzoj 3110 [Zjoi2013]K大数查询【树套树||整体二分】

    树套树: 约等于是个暴力了.以区间线段树的方式开一棵权值线段树,在权值线段树的每一个点上以动态开点的方式开一棵区间线段树. 结果非常惨烈(时限20s) #include<iostream> ...

  3. glance镜像服务

    一.glance介绍: 因为云平台是提供Iass层的基础设施服务,我们拿到的是一台虚拟机,那么要用虚拟机的话必须有底层的镜像做支撑,所以说镜像的话也有一个服务来管理.但是我们云平台用的镜像不是装操作系 ...

  4. Luogu P1004/P1006 方格取数/传纸条 【棋盘Dp】 By cellur925

    我明明记得写过这篇啊qwq为什么会搞丢 两题几乎一样. 如果再拓展到k条路,就要用网络流跑了,本蒟现在还不会. 我们容易想到四维dp,但是有一种更好的方法. 首先,先从左上到右下.再从右下到左上可以近 ...

  5. ______________从时间超限到800ms 到200ms——————2098

    分拆素数和 Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): Accepted S ...

  6. SpringMVC之HttpMessageConverter

    http://blog.csdn.net/zmx729618/article/details/53034420 HttpMessageConverter接口: T read(Class<? ex ...

  7. Poj 3264 Balanced Lineup RMQ模板

    题目链接: Poj 3264 Balanced Lineup 题目描述: 给出一个n个数的序列,有q个查询,每次查询区间[l, r]内的最大值与最小值的绝对值. 解题思路: 很模板的RMQ模板题,在这 ...

  8. Bryce1010的linux课程设计

    1.设计目的 2.软件环境 3.要求 4.需求分析 5.总体设计 6.详细设计 7.调试与测试 8.总结 思路整理: 1.如果要开始编译着手的准备 SQLite数据库的安装 gtk+的安装 (.... ...

  9. 递推DP UVA 1291 Dance Dance Revolution

    题目传送门 题意:给一串跳舞的动作,至少一只脚落到指定的位置,不同的走法有不同的体力消耗,问最小体力消费多少分析:dp[i][j][k] 表示前i个动作,当前状态(j, k)的最小消费,状态转移方程: ...

  10. 命名管道实现进程间通信--石头、剪刀、布游戏 分类: linux 2014-06-01 22:50 467人阅读 评论(0) 收藏

    下面这个程序利用命名管道实现进程间通信,模拟石头剪刀布游戏. 主进程为裁判进程,两个子进程为选手进程.裁判与选手间各建立一个命名管道. 进行100次出招,最后给出游戏胜负. #include < ...