Java中通过jdbc调用oracle存储过程

Java调用Oracle存储过程步骤主要分为三类:
(1)编写Oracle存储过程
(2)编写数据库获取连接工具类
(3)编写简单应用调用存储过程

1、Oracle中的存储过程程序
1.在Oracle SQL Developer中创建存储过程
在scott数据库用户中新建一个存储过程(查询某个员工姓名 月薪和职位):
create or replace procedure queryperson(empid in number,pname out varchar,psal out number,pjob out varchar)
as
begin
–得到该员工的姓名 月薪和职位
select ename,sal,job into pname,psal,pjob from emp where empno=empid;
end;
/
如下图所示:
Java中通过jdbc调用oracle存储过程_第1张图片
2、连接数据库工具类
创建JDBC连接Oracle数据库
(1)我们在JDBC知识中知道:
JDBC编程六步曲
1.注册数据库驱动
1 获取驱动对象
2 注册驱动
2.获取数据库连接
3.获取数据库连接对象
4.执行SQL语句
1 若是执行DQL语句,则执行完后,顺序执行步骤5的处理查询结果集
2 若是执行DML语句,则不用执行步骤5,执行执行步骤6
5.处理查询结果集
6.关闭资源

(2)在这里,因为我们是要在第三个部分来调用Oracle数据库存储过程子程序,
所以,我们在JDBC编程六步曲中,第4步和第5步可以省略,相当于这两个小节放在了第三部分调用存储过程。
因此,此时我们的jdbc连接数据库工具类步骤为:
1.注册数据库驱动
1 获取驱动对象
2 注册驱动
2.获取数据库连接
3.获取数据库连接对象
6.关闭资源

(3)在Java的开发工具MyEclipse中编写连接数据库工具类程序
package plsql01;

//import java.sql.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCUtils {
//获取连接数据库的四条数据信息,即定义4个变量
private static String driver = “oracle.jdbc.OracleDriver”;
private static String url = “jdbc:oracle:thin:@localhost:1521:orcl”;
private static String user = “scott”;
private static String password = “tiger”;

//1.注册数据库驱动。通过静态代码块来编写
static{
    try {
        //反射
        Class.forName(driver);
    } catch (ClassNotFoundException e) {
        throw new ExceptionInInitializerError(e);
    }
}

//2.获取数据库连接
public static Connection getConnection(){
    try {
        return DriverManager.getConnection(url,user,password);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return  null;
}

//3.获取数据库连接对象
public static Statement getStatement() {
    Statement st = null;
    try {
      st = getConnection().createStatement();
    } catch (SQLException e) {
      e.printStackTrace();
    }
    return st;
}

//6.关闭资源
public static void release(Connection conn, Statement st, ResultSet rs){
    //关闭数据库连接资源
    if(rs != null){
        try {
            rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //关闭数据库连接对象资源
    if(st != null){
        try {
            st.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //关闭查询结果资源
    if(conn != null){
        try {
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

}

3、调用存储过程
通过2中的JDBC连接数据库工具类来调用已经编译好的1中的存储过程子程序
下面代码中导入的几个注释的包是没用到的,多此一举。
package plsql01;

import java.sql.CallableStatement;
import java.sql.Connection;
//import java.sql.PreparedStatement;
//import java.sql.ResultSet;
//import java.sql.SQLException;
//import org.junit.Test;
//import oracle.jdbc.OracleTypes;

public class TestProcedure {
// public void testProcedure(){ //应该换成主函数main()
public static void main(String[] args) {
Connection conn = null;
String sql = “{call queryperson(?,?,?,?)}”;
CallableStatement call = null;
try{
//得到一个连接
conn = JDBCUtils.getConnection();
//通过连接创建出statment
call = conn.prepareCall(sql);

        //对于in参数,赋值,取出员工编号为7934的员工信息
        call.setInt(1,7934);

        //对于out参数,申明
        call.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);
        call.registerOutParameter(3, oracle.jdbc.OracleTypes.NUMBER);
        call.registerOutParameter(4, oracle.jdbc.OracleTypes.VARCHAR);

        //执行调用
        call.execute();

        //取出结果
        String name = call.getString(2);
        double sal = call.getDouble(3);
        String job = call.getString(4);
        System.out.println(name+"\t"+sal+"\t"+job);
    } catch (Exception e){
        e.printStackTrace();
    }finally {
        JDBCUtils.release(conn,call,null);
    }
}

}
运行,输出结果:
MILLER 4100.0 CLERK
如下图所示:
Java中通过jdbc调用oracle存储过程_第2张图片
4、上面项目程序出现的低级错误
(1)The import oracle cannot be resolved TestProcedure.java /PLSQL_012/src/plsql01 line 10 Java Problem
原因是:MyEclipse中进行数据库相关开发,需要将数据库的驱动与MyEclipse建立连接。如果用的是oracle,因此,需要先将oracle的(驱动)jar包导入到MyEclipse,这样才能进一步开发。
可以参考:https://www.cnblogs.com/tv151579/archive/2013/02/26/2933405.html
(2)运行项目时,MyEclipse中出现Press the Delete button to remove the selected configuration
原因是:没有找到对应的main函数,所以不知道从哪里开始执行。因此,发现了这个低级错误,将
public void testProcedure()换成主函数main()

5、将连接数据库工具类和调用存储过程程序编写在一起的代码:
package plsql02;
import java.sql.*;

public class TestProcedure {
/**
* @oracle存储过程jdbc调用
*/
public static void main(String[] args) {
//1、定义变量
String driverClass = “oracle.jdbc.OracleDriver”;
String url = “jdbc:oracle:thin:@localhost:1521:orcl”;
String user = “scott”;
String password = “tiger”;
try{
Class.forName(driverClass);
//2、获取连接对象
Connection connection = DriverManager.getConnection(url, user, password);
//3、创建执行存储过程的语句对象
String sql = “{call queryperson(?,?,?,?)}”;
CallableStatement call = connection.prepareCall(sql);
//4、设置参数
call.setInt(1,7934);
call.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);
call.registerOutParameter(3, oracle.jdbc.OracleTypes.NUMBER);
call.registerOutParameter(4, oracle.jdbc.OracleTypes.VARCHAR);
//5、执行存储过程
call.execute();
//6、获取数据并输出结果
String name = call.getString(2);double sal = call.getDouble(3);
String job = call.getString(4);
System.out.println(“姓名:”+”\t”+”员工工资:”+”\t”+”员工职位:”);
System.out.println(name+”\t”+sal+”\t”+job);
//7、释放资源
}catch(Exception e){
e.printStackTrace();
}
}
}
输出结果:
姓名: 员工工资: 员工职位:
MILLER 4100.0 CLERK
如下图所示:
Java中通过jdbc调用oracle存储过程_第3张图片
本篇博文借鉴了以下大神的博客,感谢大神。
参考:
http://www.jb51.net/article/106099.htm
https://blog.csdn.net/yczz/article/details/46892455
https://www.2cto.com/database/201710/689989.html

https://www.cnblogs.com/gx-java/p/6550409.html
https://blog.csdn.net/u012734723/article/details/72892524
https://www.cnblogs.com/zzj0410/p/5472994.html

你可能感兴趣的:(数据库)