首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JDBC 呼叫 SQL Server 儲存程序進階:返回狀態與更新計數

     編輯:Java 相關知識

前言

承接基礎篇,本文深入探討兩類進階場景:帶返回狀態的儲存程序與帶更新計數的儲存程序,並示範如何透過 `CallableStatement` 正確處理輸出參數與影響行數。

一、使用帶返回狀態的儲存程序

語法規範

{[?=]call procedure-name[([parameter][,[parameter]]...)]}
  • 以 `?` 佔位符代表返回狀態參數,序數固定為 1。
  • 執行前必須呼叫 `registerOutParameter(1, Types.INTEGER)` 註冊輸出型別。

範例:檢查城市是否存在

-- SQL Server 儲存程序
CREATE PROCEDURE CheckContactCity (@cityName CHAR(50))
AS BEGIN
    IF ((SELECT COUNT(*) FROM Person.Address WHERE City = @cityName) > 1)
        RETURN 1
    ELSE
        RETURN 0
END

Java 呼叫代碼

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));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

二、使用帶更新計數的儲存程序

關鍵差異

  • `executeUpdate()` 直接返回受影響行數(`int`)。
  • `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;

Java 代碼(使用 execute + 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();
        System.out.println("ROWS AFFECTED: " + count);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

最佳實踐提醒

  1. 資源管理:採用 try-with-resources 確保 `CallableStatement` 自動關閉。
  2. 參數序數:返回狀態參數永遠是第 1 個,後續業務參數從 2 開始。
  3. 異常處理:捕捉 `SQLException` 並記錄堆疊,避免靜默失敗。
  4. 效能考量:頻繁呼叫儲存程序時,考慮連線池與批次處理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved