JobPlus知识库 IT 大数据 文章
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; 

如下图所示: 

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 
如下图所示: 

4、上面项目程序出现的低级错误 
(1)The import oracle cannot be resolved TestProcedure.java /PLSQL_012/src/plsql01 line 10 Java Problem 
原因是:MyEclipse中进行数据库相关开发,需要将数据库的驱动与MyEclipse建立连接。如果用的是oracle,因此,需要先将oracle的(驱动)jar包导入到MyEclipse,这样才能进一步开发。 

(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 
如下图所示: 


如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

¥ 打赏支持
427人赞 举报
分享到
用户评价(0)

暂无评价,你也可以发布评价哦:)

扫码APP

扫描使用APP

扫码使用

扫描使用小程序