Java链接Oracle数据库时候调用含有游标的存储过程(两种不同处理方式)

    最经这段时间在学习Oracle中的PL/SQL了,其中存储过程和游标的使用应该算是比较重要的东西了。在周日的下午,突然想写点东西,刚好把自己这段 时间的学习感悟写写吧。一者可以总结自己的学习,二者希望可以可以给其它学习的人提供一点帮助。我也仅仅是一名Java学习菜鸟。还望各位大神级别的人要 是看到了不准批斗小弟。好了,废话不多说了。切入正题吧。

   假设我们需要通过JDBC连接Oracle数据库,暂时就拿Oracle数据库自带的表emp(scott模式下的)表和dept表。根据我们输入的一个部门标号dno,类型为number,输出该部门下的所有员工的编号和员工姓名。

   第一种存储过程的使用方法:

   思路如下:

             1:新建一个Packages,例如名称为:first_package

             2:再实现一个package bodies,注意了其名称必须和packages的名字相同,因为其是对packages的实现吗,正如java中接口的实现一样。所以名称也为:first_package

             3:Java中调用存储过程。

代码如下:

定义一个package:

create or replace package first_package is

     -- Public type declarations
   type mycur is ref cursor;
 
   procedure proc_cur(dno in number,cur out mycur);

end first_package;

实现package

create or replace package body first_packageis
--注意此处无begin
procedure proc_cur(dno in number,cur out mycur)
  as
  begin
    open cur for select * from emp where emp.deptno=dno;
end proc_cur;
end test_package;

Java中调用存储过程:

定义一个DBUtils工具类

package com.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * 获取Connection等连接的工具类
 * @author Administrator
 */
public class DBUtils {
    Connection conn=null;

    //url和user,password
    Stringurl="jdbc:oracle:thin:@192.168.19.39:1521:orcl";
    String user="scott";
    String password="tiger";

//获得连接对象Connection
    public Connection getConnection(){
        //加载驱动
        StringoracleDriver="oracle.jdbc.driver.OracleDriver";
        try {
           Class.forName(oracleDriver);
            //获得连接
           conn=DriverManager.getConnection(url, user, password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }
    //关闭Connection对象
    public void closeConn(Connection conn){
        if(conn!=null){
            try {
               conn.close();
            } catch (SQLExceptione) {
               e.printStackTrace();
            }
        }
    }
}

测试类:

package com.jdbc;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

import oracle.jdbc.OracleTypes;

/**
 * 测试类
 * @author Clark
 *
 */
public class JdbcTest {
    static DBUtils db=new DBUtils();
    static Connection conn=null;
    public static void main(String[] args) {
        try {
            //获得连接对象
           conn=db.getConnection();
            //获得调用存储过程的对象
            CallableStatementcstm=getCallableStatement(conn);
            //设置参数值
            cstm.setInt(1, 20);
            //因为存储过程中定义第二个参数为out,而且其类型为游标型
           cstm.registerOutParameter(2, OracleTypes.CURSOR);
            //执行调用存储过程
            cstm.execute();
            //获得执行后返回的游标集合,其索引对应着存储过程中的参数位置,如本题是对应着第二个,为CURSUR
            ResultSet rs=(ResultSet)cstm.getObject(2);
            while(rs.next()){
                //获得游标中(也即emp表中的信息)
                //取出第一个字段值  empno---number
                intid=rs.getInt(1);
               String ename=rs.getString(2);
               System.out.println("员工编号:"+id+" 员工姓名:"+ename);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            db.closeConn(conn);
        }
    }
    //获得CallableStatement,其为调用存储过程的对象
    public static CallableStatement getCallableStatement(Connectionconn) throws SQLException{
        //调用存储过程的语句{callpackage body name.procedureName(?..?)}
        String sql="{callfirst_package.proc_cur(?,?)}";
        //获得调用存储过程的对象
        CallableStatementcstm=conn.prepareCall(sql);
        return cstm;
    }
}

第二种存储过程的使用方法:

1:新建一个Packages,例如名称为:first_package

create or replace package first_package is

     -- Public type declarations
   type mycur is ref cursor;
 
   procedure proc_cur(dno in number,cur out mycur);

end first_package;

 

2:直接创建procedure,而不用再实现package bodies

create or replace procedure proc_cur(dno innumber, mycur outfirst_package.mycur)
is
    
  begin
    open  mycur for select * from emp where emp.deptno=dno; 
end proc_cur;

3:Java中直接调用

  //"{call 存储过程名(parameterp1,parameter p2,...)}"

//获取CallableStatement调用存储过程的对象
    public static CallableStatementgetCallableStatement(Connection conn){
        String sql="{call proc_cur(?,?)}";
        CallableStatement cstm=null;
        try {
           cstm=conn.prepareCall(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return cstm;
    }

其它代码和DBUtils和测试类JdbcTest一样

 

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值