作者:樊华春



参考网站

JDBC调用存储过程

在JDBC API中提供了调用存储过程的方法,通过CallableStatement对象进行操作。CallableStatement对象位于java.sql包中,它继承于Statement对象,主要用于执行数据库中定义的存储过程。

JDBC 中的 CallableStatement 对象为所有的关系数据库管理系统 (RDBMS: Relational Database Management System) 提供了一种标准形式调用存储过程的方法。对存储过程的调用有两种形式:带结果参数和不带结果参数。结果参数是一种输出参数,是存储过程的返回值。两种形式都可带有数量可变的输入(IN 参数)、输出(OUT 参数)或输入和输出(INOUT 参数)的参数。

在JDBC 中调用存储过程的语法为:{call procedure_name[(?, ?,...)]};返回结果参数的存储过程的语法为:{? = call procedure_name[(?, ?,...)]};不带参数的存储过程的语法为:{call procedure_name}。其中,问号代表参数,方括号表示其间的内容是可选

 

使用CallableStatement 对象调用存储过程的过程如下:

使用Connection.prepareCall 方法创建一个CallableStatement 对象。 
使用 CallableStatement.setXXX 方法给输入参数(IN)赋值。 
使用 CallableStatement.registerOutParameter 方法来指明哪些参数只做输出参数(OUT),哪些是输入输出参数(INOUT)。

 

实例

1、没有任何输入和输出参数的存储过程



1.  package com.ghj.packageoftest;  
2.    
3.  import java.sql.CallableStatement;  
4.  import java.sql.Connection;  
5.  import java.sql.ResultSet;  
6.  import java.sql.SQLException;  
7.    
8.  import com.ghj.packageoftool.LinkDB;  
9.    
10.  
19.  
20.  
25.public class NoParam {  
26.    public static void main(String args[]) throws SQLException {  
27.        Connection connection = LinkDB.getMySqlConnection();  
28.        String proStr = "{call noParam}";  
29.        CallableStatement callableStatement = connection.prepareCall(proStr);  
30.        callableStatement.execute();  
31.        ResultSet resultSet = callableStatement.getResultSet();  
32.        while (resultSet.next()) {  
33.            System.out.println("产品的平均价格是:" + resultSet.getDouble("priceAvg") + "元");  
34.        }  
35.        LinkDB.close(connection, callableStatement, resultSet);  
36.    }  
37.}



 2、只有两个输入参数的存储过程



1.  package com.ghj.packageoftest;  
2.    
3.  import java.sql.CallableStatement;  
4.  import java.sql.Connection;  
5.  import java.sql.ResultSet;  
6.  import java.sql.SQLException;  
7.    
8.  import com.ghj.packageoftool.LinkDB;  
9.    
10.  
19.  
20.  
25.public class InTwoParam {  
26.    public static void main(String args[]) throws SQLException {  
27.        Connection connection = LinkDB.getMySqlConnection();  
28.        String procStr = "{call inTwoParam(?,?)}";  
29.        CallableStatement callableStatement = connection.prepareCall(procStr);  
30.        callableStatement.setString(1, "莲");  
31.        callableStatement.setDouble(2, 88.88);//对DECIMAL类型的属性设值要使用setDouble方法。  
32.        callableStatement.execute();  
33.        ResultSet resultSet = callableStatement.getResultSet();  
34.        System.out.println("名称包含‘莲’字且价格小于88.88元的水果有:");  
35.        while (resultSet.next()) {  
36.            System.err.println("名称:" + resultSet.getString("name") +"、价格:" + resultSet.getDouble("price") + "元"+"、产地:" + resultSet.getString("address"));  
37.        }  
38.        LinkDB.close(connection, callableStatement, resultSet);  
39.    }  
40.}



 



3.只有两个输出参数的存储过程



1.  package com.ghj.packageoftest;  
2.    
3.  import java.sql.CallableStatement;  
4.  import java.sql.Connection;  
5.  import java.sql.SQLException;  
6.  import java.sql.Types;  
7.    
8.  import com.ghj.packageoftool.LinkDB;  
9.    
10.  
21.  
22.  
27.public class OutTwoParam {  
28.    public static void main(String args[]) throws SQLException {  
29.        Connection connection = LinkDB.getMySqlConnection();  
30.        String proStr = "{call outTwoParam(?,?)}";  
31.        CallableStatement callableStatement = connection.prepareCall(proStr);  
32.        callableStatement.registerOutParameter(1, Types.VARCHAR);  
33.        callableStatement.registerOutParameter(2, Types.DECIMAL);  
34.        callableStatement.execute();  
35.        String fruitName = callableStatement.getString(1);  
36.        double fruitPrice = callableStatement.getDouble(2);// 获取DECIMAL类型的属性要使用getDouble方法。  
37.        System.out.println("水果名称:" + fruitName +"、水果价格:" + fruitPrice + "元");  
38.        LinkDB.close(connection, callableStatement, null);  
39.    }  
40.}



 



 4、含有一个输入参数和一个输出参数的存储过程



1.  package com.ghj.packageoftest;  
2.    
3.  import java.sql.CallableStatement;  
4.  import java.sql.Connection;  
5.  import java.sql.SQLException;  
6.  import java.sql.Types;  
7.    
8.  import com.ghj.packageoftool.LinkDB;  
9.    
10.  
19.   
20.  
25.public class InOneParamAndOutOneParam {  
26.    public static  void main(String args[]) throws SQLException {  
27.        Connection connection=LinkDB.getMySqlConnection();  
28.        CallableStatement callableStatement=null;  
29.        String procStr="{call inOneParamAndOutOneParam(?,?)}";  
30.        callableStatement=connection.prepareCall(procStr);  
31.        String fruitName = "莲雾";  
32.        callableStatement.setString(1, fruitName);  
33.        callableStatement.registerOutParameter(2, Types.DECIMAL);  
34.        callableStatement.execute();  
35.        double fruitPrice=callableStatement.getDouble(2);//获取DECIMAL类型的属性要使用getDouble方法。  
36.        System.out.println(fruitName+"的价格为:"+fruitPrice+"元");  
37.        LinkDB.close(connection, callableStatement, null);  
38.    }  
39.}



 



5、输入参数即输出参数的存储过程



1.  package com.ghj.packageoftest;  
2.    
3.  import java.sql.*;  
4.    
5.  import com.ghj.packageoftool.LinkDB;  
6.    
7.    
26.  
27.  
32.public class InOneParamISOutOneParam {  
33.    public static void main(String args[]) throws SQLException {  
34.        Connection con = LinkDB.getMySqlConnection();  
35.        CallableStatement callableStatement = null;  
36.        String procStr = "{call inOneParamISOutOneParam(?)}";  
37.        callableStatement = con.prepareCall(procStr);  
38.        callableStatement.setString(1, "莲");  
39.        callableStatement.registerOutParameter(1, Types.VARCHAR);  
40.        callableStatement.execute();  
41.        String fruitName = callableStatement.getString(1);  
42.        System.out.println("表中水果名称含有‘莲’字的一中水果的名称是:" + fruitName);  
43.        LinkDB.close(con, callableStatement, null);  
44.    }  
45.}