JSP虛擬主機,jsp空間,java空間,java虛擬空間JSP虛擬主機,jsp空間,java空間,java虛擬空間

MySQL中使用存儲過程(整理)



作者:    文章來源:
發布日期:2007年04月15日
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"); 
[link=http://]
Copyright © 2002-2012 JSPCN.net. All rights reserved.
JSP中文網    備案號:粵ICP備09171188號
成都恒海科技發展有限公司    成都市一環路南二段6號新瑞樓三樓8號
一肖中特公开威up