共用方式為


使用含傳回狀態的預存程序

下載 JDBC 驅動程式

您可以呼叫的 SQL Server 預存程序是會傳回狀態或結果參數的預存程序。 此狀態通常用於指出預存程序的成功或失敗。 Microsoft JDBC Driver for SQL Server 會提供 SQLServerCallableStatement 類別,您可以使用此類別呼叫此種類的預存程序並處理其所傳回資料。

當您使用 JDBC 驅動程式來呼叫此種預存程序時,您必須使用 call SQL 逸出序列來搭配 SQLServerConnection 類別的 prepareCall 方法。 含有傳回狀態參數之 call 逸出序列的語法如下:

{[?=]call procedure-name[([parameter][,[parameter]]...)]}

注意

如需 SQL 逸出序列的詳細資訊,請參閱使用 SQL 逸出序列

當您建構 call 逸出序列時,請使用 ? (問號) 字元指定傳回狀態參數。 此字元會充當預留位置,代表將從預存程序傳回的參數值。 若要指定傳回狀態參數的值,在執行預存程序之前,您必須使用 SQLServerCallableStatement 類別的 registerOutParameter 方法來指定參數的資料類型。

注意

搭配使用 JDBC 驅動程式與 SQL Server 資料庫時,在 registerOutParameter 方法中指定給傳回狀態參數的值一律為整數,您可以使用 java.sql.Types.INTEGER 資料類型來指定此整數。

此外,當您將值傳遞至傳回狀態參數的 registerOutParameter 方法時,您不只要指定使用於參數的資料類型,還要指定參數在預存程序呼叫中的序數位置。 以傳回狀態參數而言,其序數位置一律為 1,因為它一律為預存程序呼叫中的第一個參數。 雖然 SQLServerCallableStatement 類別提供使用參數名稱表示特定參數的支援,但是您只能將參數的序數位置號碼用於傳回狀態參數。

例如,在 AdventureWorks2022 範例資料庫中建立下列預存程序:

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,視 cityName 參數中指定的城市是否可在 Person.Address 資料表中找到而定。

在下列範例中,AdventureWorks2022 範例資料庫的開啟連線會傳入函式中,並使用 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));
    }
    // Handle any errors that may have occurred.
    catch (SQLException e) {
        e.printStackTrace();
    }
}

另請參閱

搭配預存程序使用陳述式