国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java中調用SQL Server存儲過程詳解

Java中調用SQL Server存儲過程詳解

2019-12-08 21:12junjie JAVA教程

這篇文章主要介紹了Java中調用SQL Server存儲過程詳解,本文講解了使用不帶參數的存儲過程、使用帶有輸入參數的存儲過程、使用帶有輸出參數的存儲過程、使用帶有返回狀態的存儲過程、使用帶有更新計數的存儲過程等操作實例,需

本文作者介紹了通過Java如何去調用SQL Server存儲過程,詳解了5種不同的存儲。詳細請看下文

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 應用程序中使用命名參數。請注意,這些參數名稱對應于存儲過程的定義中的參數名稱: 11x16CREATE 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 類支持使用參數的名稱來指示特定參數,但您只能對返回狀態參數使用參數的序號位置編號。

作為實例,在 SQL Server 2005 AdventureWorks 示例數據庫中創建以下存儲過程:

復制代碼代碼如下:

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 方法。

作為實例,在 SQL Server 2005 AdventureWorks 示例數據庫中創建以下表和存儲過程:

復制代碼代碼如下:


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();

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久久99精品免费观看 | 99亚洲精品 | 色噜噜狠狠狠综合曰曰曰88av | 亚洲香蕉视频 | 国产精品国产a级 | 欧美大片一区二区 | 久久精品国产亚洲一区二区三区 | 欧美精品不卡 | 91视频免费观看 | 精久久| 色五月激情五月 | 亚洲欧美福利视频 | av一区二区三区免费观看 | 91免费看网站 | 国产91视频在线观看 | 日韩精品一二三区 | 亚洲精品一区二区三区蜜桃久 | 久久天堂网 | 九色网址| 黄色网页在线观看 | 三级无遮挡污在线观看 | 久久一区二区视频 | 国产中文字幕在线 | 人人射 | 一级黄色一级毛片 | 自拍视频在线观看 | 成人a在线视频免费观看 | 欧美操穴| 日韩免费网站 | 国产免费久久 | 久久综合久久久 | 亚洲成人午夜电影 | 日韩欧美一区二区在线观看视频 | 亚洲精品国产乱码在线看蜜月 | 国产精品亚洲视频 | av永久 | www国产在线观看 | 日韩91| 黄色在线免费观看 | 国产精品无码久久久久 | 国产 欧美 日产久久 |