java調用的各種存儲過程

1、使用不帶參數的存儲過程
          使用 JDBC 驅動程序調用不帶參數的存儲過程時,必須使用 call SQL 轉義序列。不帶參數的 call 轉義序列的語法如下所示:
 {call procedure-name} 作爲實例,在 SQL Server 2005 AdventureWorks 示例數據庫中創建以下存儲過程:
以下是引用片段:
CREATE PROCEDURE GetContactFormalNames
  AS
  BEGIN
   SELECT TOP 10 Title + ' ' + FirstName + ' ' + LastName AS FormalName
   FROM Person.Contact
  END
此存儲過程返回單個結果集,其中包含一列數據(由 Person.Contact 表中前十個聯繫人的稱呼、名稱和姓氏組成)。
  在下面的實例中,將向此函數傳遞 AdventureWorks 示例數據庫的打開連接,然後使用 executeQuery 方法調用 GetContactFormalNames 存儲過程。
以下是引用片段:
  public static void executeSprocNoParams(Connection con) ...{
   try ...{
   Statement stmt = con.createStatement();
  ResultSet rs = stmt.executeQuery("{call dbo.GetContactFormalNames}");
   while (rs.next()) ...{
 System.out.println(rs.getString("FormalName"));
  }
  rs.close();
  stmt.close();
  }
  catch (Exception e) ...{
  e.printStackTrace();
  }
  }
2、使用帶有輸入參數的存儲過程
     使用 JDBC 驅動程序調用帶參數的存儲過程時,必須結合 SQLServerConnection 類的 prepareCall 方法使用 call SQL 轉義序列。帶有 IN 參數的 call 轉義序列的語法如下所示:{call procedure-name[([parameter][,[parameter]]...)]} 構造 call 轉義序列時,請使用 ?(問號)字符來指定 IN 參數。此字符充當要傳遞給該存儲過程的參數值的佔位符。可以使用 SQLServerPreparedStatement 類的 setter 方法之一爲參數指定值。可使用的 setter 方法由 IN 參數的數據類型決定。
  向 setter 方法傳遞值時,不僅需要指定要在參數中使用的實際值,還必須指定參數在存儲過程中的序數位置。例如,如果存儲過程包含單個 IN 參數,則其序數值爲 1。如果存儲過程包含兩個參數,則第一個序數值爲 1,第二個序數值爲 2。作爲如何調用包含 IN 參數的存儲過程的實例,使用 SQL Server 2005 AdventureWorks 示例數據庫中的 uspGetEmployeeManagers 存儲過程。此存儲過程接受名爲 EmployeeID 的單個輸入參數(它是一個整數值),然後基於指定的 EmployeeID 返回僱員及其經理的遞歸列表。下面是調用此存儲過程的 Java 代碼:
     public static void executeSprocInParams(Connection con) ...{
   try ...{
   PreparedStatement pstmt = con.prepareStatement("{call dbo.uspGetEmployeeManagers(?)}");
   pstmt.setInt(1, 50);
   ResultSet rs = pstmt.executeQuery();
   while (rs.next()) ...{
   System.out.println("EMPLOYEE:");
   System.out.println(rs.getString("LastName") + ", " + rs.getString("FirstName"));
   System.out.println("MANAGER:");
   System.out.println(rs.getString("ManagerLastName") + ", " + rs.getString("ManagerFirstName"));
   System.out.println();
   }
   rs.close();
   pstmt.close();
   }
   catch (Exception e) ...{
   e.printStackTrace();
   }
  }
3、使用帶有輸出參數的存儲過程
     使用 JDBC 驅動程序調用此類存儲過程時,必須結合 SQLServerConnection 類的 prepareCall 方法使用 call SQL 轉義序列。帶有 OUT 參數的 call 轉義序列的語法如下所示:{call procedure-name[([parameter][,[parameter]]...)]} 構造 call 轉義序列時,請使用 ?(問號)字符來指定 OUT 參數。此字符充當要從該存儲過程返回的參數值的佔位符。要爲 OUT 參數指定值,必須在運行存儲過程前使用 SQLServerCallableStatement 類的 registerOutParameter 方法指定各參數的數據類型。
  使用 registerOutParameter 方法爲 OUT 參數指定的值必須是 java.sql.Types 所包含的 JDBC 數據類型之一,而它又被映射成本地 SQL Server 數據類型之一。有關 JDBC 和 SQL Server 數據類型的詳細信息,請參閱瞭解 JDBC 驅動程序數據類型。
  當您對於 OUT 參數向 registerOutParameter 方法傳遞一個值時,不僅必須指定要用於此參數的數據類型,而且必須在存儲過程中指定此參數的序號位置或此參數的名稱。例如,如果存儲過程包含單個 OUT 參數,則其序數值爲 1;如果存儲過程包含兩個參數,則第一個序數值爲 1,第二個序數值爲 2。
  作爲實例,在 SQL Server 2005 AdventureWorks 示例數據庫中創建以下存儲過程: 根據指定的整數 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 應用程序中使用命名參數。請注意,這些參數名稱對應於存儲過程的定義中的參數名稱: CREATE PROCEDURE GetImmediateManager
以下是引用片段:
 @employeeID INT,
   @managerID INT OUTPUT
  AS
  BEGIN
   SELECT @managerID = ManagerID
   FROM HumanResources.Employee
   WHERE EmployeeID = @employeeID
  END
  存儲過程可能返回更新計數和多個結果集。Microsoft SQL Server 2005 JDBC Driver 遵循 JDBC 3.0 規範,此規範規定在檢索 OUT 參數之前應檢索多個結果集和更新計數。也就是說,應用程序應先檢索所有 ResultSet 對象和更新計數,然後使用 CallableStatement.getter 方法檢索 OUT 參數。否則,當檢索 OUT 參數時,尚未檢索的 ResultSet 對象和更新計數將丟失。
4、使用帶有返回狀態的存儲過程
     使用 JDBC 驅動程序調用這種存儲過程時,必須結合 SQLServerConnection 類的 prepareCall 方法使用 call SQL 轉義序列。返回狀態參數的 call 轉義序列的語法如下所示:
{[?=]call procedure-name[([parameter][,[parameter]]...)]} 構造 call 轉義序列時,請使用 ?(問號)字符來指定返回狀態參數。此字符充當要從該存儲過程返回的參數值的佔位符。要爲返回狀態參數指定值,必須在執行存儲過程前使用 SQLServerCallableStatement 類的 registerOutParameter 方法指定參數的數據類型。
  此外,向 registerOutParameter 方法傳遞返回狀態參數值時,不僅需要指定要使用的參數的數據類型,還必須指定參數在存儲過程中的序數位置。對於返回狀態參數,其序數位置始終爲 1,這是因爲它始終是調用存儲過程時的第一個參數。儘管 SQLServerCallableStatement 類支持使用參數的名稱來指示特定參數,但您只能對返回狀態參數使用參數的序號位置編號。
CREATE PROCEDURE CheckContactCity
   (@cityName CHAR(50))
  AS
  BEGIN
   IF ((SELECT COUNT(*)
   FROM Person.Address
   WHERE City = @cityName) > 1)
   RETURN 1
  ELSE
   RETURN 0
  END
  該存儲過程返回狀態值 1 或 0,這取決於是否能在表 Person.Address 中找到 cityName 參數指定的城市。
在下面的實例中,將向此函數傳遞 AdventureWorks 示例數據庫的打開連接,然後使用 execute 方法調用 CheckContactCity 存儲過程:
public static void executeStoredProcedure(Connection con) ...{
   try ...{
   CallableStatement cstmt = con.prepareCall("{? = call dbo.CheckContactCity(?)}");
   cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
   cstmt.setString(2, "Atlanta");
   cstmt.execute();
   System.out.println("RETURN STATUS: " + cstmt.getInt(1));
   }
   cstmt.close();
   catch (Exception e) ...{
   e.printStackTrace();
   }
  }
5、使用帶有更新計數的存儲過程
  使用 SQLServerCallableStatement 類構建對存儲過程的調用之後,可以使用 execute 或 executeUpdate 方法中的任意一個來調用此存儲過程。executeUpdate 方法將返回一個 int 值,該值包含受此存儲過程影響的行數,但 execute 方法不返回此值。如果使用 execute 方法,並且希望獲得受影響的行數計數,則可以在運行存儲過程後調用 getUpdateCount 方法。
CREATE TABLE TestTable
   (Col1 int IDENTITY,
   Col2 varchar(50),
   Col3 int);
  CREATE PROCEDURE UpdateTestTable
   @Col2 varchar(50),
   @Col3 int
  AS
  BEGIN
   UPDATE TestTable
   SET Col2 = @Col2, Col3 = @Col3
  END;
在下面的實例中,將向此函數傳遞 AdventureWorks 示例數據庫的打開連接,並使用 execute 方法調用 UpdateTestTable 存儲過程,然後使用 getUpdateCount 方法返回受存儲過程影響的行計數。 以下是引用片段:
public static void executeUpdateStoredProcedure(Connection con) ...{
   try ...{
   CallableStatement cstmt = con.prepareCall("{call dbo.UpdateTestTable(?, ?)}");
   cstmt.setString(1, "A");
   cstmt.setInt(2, 100);
   cstmt.execute();
   int count = cstmt.getUpdateCount();
   cstmt.close();
   System.out.println("ROWS AFFECTED: " + count);
   }
   catch (Exception e) ...{
   e.printStackTrace();
   }
  }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章