|  | 本文参考《Java网络编程核心技术详解》,作者:孙卫琴,电子工业出版社出版 源代码下载地址为:http://www.javathinker.net/kecheng/javanet/javanetsourcecode.rar
 
 java.sql.CallableStatement接口用来执行数据库中的存储过程。Connection的prepareCall()方法创建一个CallableStatement对象。假设MySQL数据库中有一个名为demoSp的存储过程,它的定义如下:
 
 | delimiter  // CREATE PROCEDURE demoSp(IN inputParam VARCHAR(255), INOUT inOutParam INT)
 BEGIN
 DECLARE z INT;
 SET z = inOutParam + 1;
 SET inOutParam = z;
 
 SELECT CONCAT('hello ', inputParam);
 END  //
 | 
 以上代码位于配套源代码包的sourcecode/chapter12/sql/demoSp.sql中。以上存储过程有两个参数,第一个参数inputParam是VARCHAR类型,并且是输入(IN)参数,第二个参数inOutParam是INT类型,并且是输入输出(INOUT)参数。对于输入输出参数,调用者既可以向存储过程传入参数值,也可以在存储过程执行完毕后读取被更新的参数值。以下ProcedureTester类演示如何调用该存储过程。
 
 
 | /* ProcedureTester.java */ 
 import java.sql.*;
 public class ProcedureTester{
 public static void main(String args[])throws Exception{
 //加载驱动器,下面的代码为加载MySQL驱动器
 Class.forName("com.mysql.cj.jdbc.Driver");
 
 //连接到数据库的URL,serverTimeZone表示时区
 String dbUrl = "jdbc:mysql://localhost:3306/STOREDB"
 + "?serverTimezone=Asia/Shanghai";
 String dbUser="dbuser";
 String dbPwd="1234";
 //建立数据库连接
 Connection con = DriverManager.getConnection(dbUrl,dbUser,dbPwd);
 //创建一个调用demoSp存储过程的CallableStatement对象。
 CallableStatement cStmt = con.prepareCall("{call demoSp(?, ?)}");
 //设置第一个参数的值
 cStmt.setString(1, "Tom"); //按索引位置指定参数
 //cStmt.setString("inputParam", "Tom"); //按名字指定参数
 
 //注册第二个参数的类型
 cStmt.registerOutParameter(2, Types.INTEGER); //按索引位置指定参数
 //按名字指定参数
 //cStmt.registerOutParameter("inOutParam", Types.INTEGER);
 
 //设置第二个参数的值
 cStmt.setInt(2, 1); //按索引位置指定参数
 //cStmt.setInt("inOutParam", 1); //按名字指定参数
 
 //执行存储过程
 boolean hadResults = cStmt.execute();
 
 //访问结果集
 if (hadResults) {
 ResultSet rs = cStmt.getResultSet();
 //SQLExecutor类参见12.4.4节的例程12-8
 SQLExecutor.showResultSet(rs);
 }
 
 //获得第二个参数的输出值
 int outputValue = cStmt.getInt(2); //按索引位置指定参数
 //int outputValue = cStmt.getInt("inOutParam"); //按名字指定参数
 
 con.close();
 }
 }
 | 
 创建CallableStatement对象的代码如下:
 
 
 | CallableStatement cStmt = con.prepareCall("{call demoSp(?, ?)}"); | 
 以上两个问号分别代表存储过程的两个参数。可通过以下两种方式为参数赋值:
 
 
 | //方式一:指定参数的索引位置 cStmt.setString(1, "Tom");
 cStmt.setInt(2, 1);
 
 //方式二:指定参数的名字
 cStmt.setString("inputParam", "Tom");
 cStmt.setInt("inOutParam", 1);
 | 
 第二个参数为输入输出参数,为了获得它的输出值,必须先通过CallableStatement 的registerOutParameter()方法注册参数的类型,然后就可以在存储过程执行完毕后通过相应的getXXX()方法获得它的输出值。
 
 
 
 程序猿的技术大观园:www.javathinker.net
 
 
 
 [这个贴子最后由 admin 在 2021-10-09 10:54:52 重新编辑]
 |  |