MySQL中使用存储过程(整理)

 MySQL中使用存储过程

使用CallableStatements执行存储过程

mysql版本:5.0
Connector/J的版本:3.1.1以上(java.sql.CallableStatement接口已完全实现,除了getParameterMetaData()方法)
MySQL的存储过程语法在MySQL参考手册的"存储过程和函数"一章.
http://www.mysql.com/doc/en/Stored_Procedures.html
下面是一个存储过程,返回一个inOutParam增1后的值,以ResultSet形式传入一个字符串参数inputParam.
CREATE PROCEDURE demoSp(IN inputParam VARCHAR(255), INOUT inOutParam INT)
BEGIN
DECLARE z INT;
SET z = inOutParam + 1;
SET inOutParam = z;
SELECT inputParam;
SELECT CONCAT('zyxw', inputParam);
END

要通过connector/J使用demoSp这个存储过程,要经过几个步骤:
1.Connection.prepareCall()

  1. import java.sql.CallableStatement;
  2. ...
  3. //
  4. // Prepare a call to the stored procedure 'demoSp'
  5. // with two parameters
  6. //
  7. // Notice the use of JDBC-escape syntax ({call ...})
  8. //
  9. CallableStatement cStmt = conn.prepareCall("{call demoSp(?, ?)}");
  10. cStmt.setString(1, "abcdefg");


Connection.prepareCall()方法非常消耗资源,因为jdbc驱动通过元数据(metadata)的获取支持输出参数.出于执行效率的考虑,应该尽可能减少不必要的prepareCall调用,重用CallableStatement对象.

2.注册输出参数(如果有的话)

要得到输出参数的值(创建存储过程时设置的OUT和INOUT),JDBC要求这些参数必须要在数据库操作执行之前通过registerOutputPrameter()方法设置.

  1. import java.sql.Types;
  2. ...
  3. //
  4. // 下面给出了设置输出参数的几个方法
  5. //
  6. // 注册第二个参数为输出参数
  7. //
  8. cStmt.registerOutParameter(2);
  9. //
  10. // 注册第二个参数为输出参数,设定getObject得到的返回值的类型为整型
  11. // 
  12. cStmt.registerOutParameter(2, Types.INTEGER);
  13. //
  14. // 注册名为"inOutParam"的参数为输出参数
  15. //
  16. cStmt.registerOutParameter("inOutParam");
  17. //
  18. // 注册名为"inOutParam"的参数为输出参数,设定getObject得到的返回值的类型为整型
  19. //
  20. cStmt.registerOutParameter("inOutParam"Types.INTEGER);


3.设置输入参数(如果有的话)
类似PreparedStatement的设置参数方法.

  1. //
  2. // 设置第一个参数值
  3. //
  4. cStmt.setString(1, "abcdefg");
  5. //
  6. // 根据名字设置参数值
  7. //
  8. cStmt.setString("inputParameter""abcdefg");
  9. //
  10. // 根据索引值设置输入/输出参数
  11. //
  12. cStmt.setInt(2, 1);
  13. //
  14. // 根据参数名设置输入/输出参数
  15. // 
  16. //
  17. cStmt.setInt("inOutParam", 1);
  18. ...



4.执行CallableStatement,获取结果集合或输出参数
尽管CallableStatement支持Statement接口的所有执行方法(executeUpdate(),executeQuery()或execute()),最具伸缩性的方法是execute(),因为你不需要知道是否这个存储过程返回结果集合.

  1. ...
  2. boolean hadResults = cStmt.execute();
  3. //
  4. // 处理返回的结果集合
  5. //
  6. while (hadResults) {
  7. ResultSet rs = cStmt.getResultSet();
  8. // 
  9. ...
  10. hadResults = cStmt.getMoreResults();
  11. }
  12. //
  13. // 获取输出参数,通过索引值或参数名
  14. //
  15. //
  16. int outputValue = cStmt.getInt(1); 
  17. outputValue = cStmt.getInt("inOutParam"); 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值