使用帶有輸出引數的儲存過程

iSQlServer發表於2009-07-14
使用帶有輸出引數的儲存過程
您可以呼叫的 SQL Server 儲存過程是返回一個或多個 OUT 引數的儲存過程,儲存過程使用這些引數將資料返回到呼叫它的應用程式。可以使用 Microsoft SQL Server 2005 JDBC Driver 提供的 SQLServerCallableStatement 類,呼叫此類儲存過程並處理其返回的資料。
使用 JDBC 驅動程式呼叫此類儲存過程時,必須結合 SQLServerConnection 類的 prepareCall 方法使用 call SQL 轉義序列。帶有 OUT 引數的 call 轉義序列的語法如下所示:
{call procedure-name[([parameter][,[parameter]]...)]} 
注意:
有關 SQL 轉義序列的詳細資訊,請參閱使用 SQL 轉義序列。

構造 call 轉義序列時,請使用 ?(問號)字元來指定 OUT 引數。此字元充當要從該儲存過程返回的引數值的佔位符。要為 OUT 引數指定值,必須在執行儲存過程前使用 SQLServerCallableStatement 類的 registerOutParameter 方法指定各引數的資料型別。
使用 registerOutParameter 方法為 OUT 引數指定的值必須是 java.sql.Types 所包含的 JDBC 資料型別之一,而它又被對映成本地 SQL Server 資料型別之一。有關 JDBC 和 SQL Server 資料型別的詳細資訊,請參閱瞭解 JDBC 驅動程式資料型別。
當您對於 OUT 引數向 registerOutParameter 方法傳遞一個值時,不僅必須指定要用於此引數的資料型別,而且必須在儲存過程中指定此引數的序號位置或此引數的名稱。例如,如果儲存過程包含單個 OUT 引數,則其序數值為 1;如果儲存過程包含兩個引數,則第一個序數值為 1,第二個序數值為 2。
注意:
JDBC 驅動程式不支援將 CURSOR、SQLVARIANT、TABLE 和 TIMESTAMP SQL Server 資料型別用作 OUT 引數。

作為例項,在 SQL Server 2005 AdventureWorks 示例資料庫中建立以下儲存過程:
 複製程式碼
CREATE PROCEDURE GetImmediateManager
   @employeeID INT,
   @managerID INT OUTPUT
AS
BEGIN
   SELECT @managerID = ManagerID 
   FROM HumanResources.Employee 
   WHERE EmployeeID = @employeeID
END


根據指定的整數 IN 引數 (employeeID),該儲存過程也返回單個整數 OUT 引數 (managerID)。根據 HumanResources.Employee 表中包含的 EmployeeID,OUT 引數中返回的值為 ManagerID。
在下面的例項中,將向此函式傳遞 AdventureWorks 示例資料庫的開啟連線,然後使用 execute 方法呼叫 GetImmediateManager 儲存過程:
 複製程式碼
public static void executeStoredProcedure(Connection con) {
   try {
      CallableStatement cstmt = con.prepareCall("{call dbo.GetImmediateManager(?, ?)}");
      cstmt.setInt(1, 5);
      cstmt.registerOutParameter(2, java.sql.Types.INTEGER);
      cstmt.execute();
      System.out.println("MANAGER ID: " + cstmt.getInt(2));
   }
   catch (Exception e) {
      e.printStackTrace();
   }
}


本示例使用序號位置來標識引數。或者,也可以使用引數的名稱(而非其序號位置)來標識此引數。下面的程式碼示例修改了上一個示例,以說明如何在 Java 應用程式中使用命名引數。請注意,這些引數名稱對應於儲存過程的定義中的引數名稱:
 複製程式碼
public static void executeStoredProcedure(Connection con) {
   try {
      CallableStatement cstmt = con.prepareCall("{call dbo.GetImmediateManager(?, ?)}");
      cstmt.setInt("employeeID", 5);
      cstmt.registerOutParameter("managerID", java.sql.Types.INTEGER);
      cstmt.execute();
      System.out.println("MANAGER ID: " + cstmt.getInt("managerID"));
      cstmt.close();
   }
   catch (Exception e) {
      e.printStackTrace();
   }


}
注意:
這些示例使用 SQLServerCallableStatement 類的 execute 方法來執行儲存過程。使用此方法是因為儲存過程也不會返回結果集。如果返回,則使用 executeQuery 方法。

儲存過程可能返回更新計數和多個結果集。Microsoft SQL Server 2005 JDBC Driver 遵循 JDBC 3.0 規範,此規範規定在檢索 OUT 引數之前應檢索多個結果集和更新計數。也就是說,應用程式應先檢索所有 ResultSet 物件和更新計數,然後使用 CallableStatement.getter 方法檢索 OUT 引數。否則,當檢索 OUT 引數時,尚未檢索的 ResultSet 物件和更新計數將丟失。有關更新計數和多個結果集的詳細資訊,請參閱使用帶有更新計數的儲存過程和使用多個結果集。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-609088/,如需轉載,請註明出處,否則將追究法律責任。

相關文章