文档章节

Java 调用存储过程 返回结果集

宇你同在
 宇你同在
发布于 2017/05/28 14:03
字数 712
阅读 49
收藏 0
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(); //关闭连接
    }
}

© 著作权归作者所有

宇你同在
粉丝 0
博文 21
码字总数 40029
作品 0
广州
私信 提问
Java CallableStatement 调用 MSSQL存储过程中sp_executesql执行的结果集

Java的JDBC中,CallableStatement cstmt = con.prepareCall(procedure); 这段代码调用普通的存储过程没有问题。 但是因为项目中特殊原因会涉及到动态表名,所以在存储过程的游标中有如下的S...

BenjaminMa
2012/05/17
1K
1
spring中的JdbcTemplate简单记录

JdbcTemplate主要提供以下五类方法: execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句; update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate...

刘谱_smile
2015/07/15
0
0
Spring JdbcTemplate方法详解

qldbFunctionSql); String createHsqldbProcedureSql = "CREATE PROCEDURE PROCEDURE_TEST" + "(INOUT inOutName VARCHAR(100), OUT outId INT) " + "MODIFIES SQL DATA " + "BEGIN ATOMIC "......

The-Start
2013/12/18
0
0
Spring JdbcTemplate方法详解

JdbcTemplate主要提供以下五类方法: execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句; update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate...

zqcju
2014/06/13
0
6
java实现调用Mysql存储过程分析代码

数据库的测试代码如下 : 1、新建表test,sql代码如下: create table test(field1 int not null)TYPE=MyISAM ;insert into test(field1) values(1); 2、删除已存在的存储过程,代码如下: de...

afreon
2015/06/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

vi命令详解

vi命令详解 vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。由于对Unix及Linux系统的任何版本,vi编...

shzwork
14分钟前
1
0
Centos 7 安装 Docker

参考 https://yq.aliyun.com/articles/110806 1. 卸载旧版的 docker $ sudo yum remove docker \ docker-client \ docker-client-latest \ ......

北漂的我
16分钟前
1
0
GitLab 发布新版本,增强的操作仪表板

昨天,GitLab的团队发布了GitLab 11.10,一个基于Web的DevOps生命周期工具。这个版本提供了新的特性,包括操作仪表板上的管道、合并结果的管道等等。 GitLab 11.10有什么新内容? 增强操作指示...

linuxCool
21分钟前
0
0
spring application 之 ResolveType

jdk1.5 的泛形 变量类型 <t>,<t,k>,<t extends list & map> 这些都是变量类型 类 class A<t extends b & list,k t>{}TypeVariable[] tvs = A.class.getTypeParameters()tvs 的 name 就是......

my_juke
26分钟前
0
0
Java 8的核心新特性:Lambda(匿名函数)、流、默认方法

Java 中的函数 Java 8中新增了函数——值的一种新形式。函数作为一等值,使用方法引用 :: 语法(即“把这个方法作为值”),作为函数式值来传递。 File[] hiddenFiles = new File(".").listF...

Lienson
36分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部