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

Java 呼叫 SQL Server 輸出參數預存程序完整範例

     編輯:關於SqlServer

場景

應用程式需透過 JDBC 呼叫 SQL Server 預存程序,並取得輸出參數(OUTPUT)作為業務邏輯判斷依據。本文展示完整的 SQL 建立腳本與 Java 程式碼範例。

一、 SQL Server 預存程序

CREATE PROCEDURE dbo.InsertOrtho
    @ChildID       VARCHAR(10) OUTPUT,
    @ApptDate      DATETIME    OUTPUT,
    @TherapistID   VARCHAR(10) OUTPUT,
    @ClinicID      INT         OUTPUT,
    @Skeletal      CHAR(1)     OUTPUT,
    @AngleClass    CHAR(1)     OUTPUT,
    @Deflection    CHAR(1)     OUTPUT,
    @OrthoNotes    VARCHAR(200) OUTPUT
AS
BEGIN
    SET NOCOUNT ON;
    INSERT INTO tblPatientOrtho
        (ChildID, ApptDate, TherapistID, ClinicID, Skeletal, AngleClass, Deflection, OrthoNotes)
    VALUES
        (@ChildID, @ApptDate, @TherapistID, @ClinicID, @Skeletal, @AngleClass, @Deflection, @OrthoNotes);
    -- 這裡可加入業務邏輯修改 OUTPUT 參數值
    RETURN 0;
END

二、 Java JDBC 呼叫程式碼

import java.sql.*;

public boolean insertOrtho(Ortho ortho, String childID) {
    boolean success = true;
    Connection con = null; // 假設已建立連線
    CallableStatement stmt = null;

    try {
        // 1. 準備呼叫語法:{call 程序名(?, ?, ...)}
        String sql = "{call InsertOrtho(?, ?, ?, ?, ?, ?, ?, ?)}";
        stmt = con.prepareCall(sql);

        // 2. 註冊所有輸出參數型別(順序與預存程序定義一致)
        stmt.registerOutParameter(1, Types.VARCHAR);      // @ChildID
        stmt.registerOutParameter(2, Types.TIMESTAMP);    // @ApptDate
        stmt.registerOutParameter(3, Types.VARCHAR);      // @TherapistID
        stmt.registerOutParameter(4, Types.INTEGER);      // @ClinicID
        stmt.registerOutParameter(5, Types.VARCHAR);      // @Skeletal
        stmt.registerOutParameter(6, Types.VARCHAR);      // @AngleClass
        stmt.registerOutParameter(7, Types.VARCHAR);      // @Deflection
        stmt.registerOutParameter(8, Types.VARCHAR);      // @OrthoNotes

        // 3. 設定輸入值(若參數同時為 INPUT/OUTPUT,需先 setXxx 再 registerOutParameter)
        stmt.setString(1, childID);
        stmt.setTimestamp(2, new Timestamp(ortho.getDate().getTime()));
        stmt.setString(3, ortho.getTherapistID());
        stmt.setInt(4, ortho.getClinicID());
        stmt.setString(5, ortho.getSkeletal());
        stmt.setString(6, ortho.getAngleClass());
        stmt.setString(7, ortho.getDeflection());
        stmt.setString(8, ortho.getOrthoNotes());

        // 4. 執行
        stmt.execute();

        // 5. 取得輸出參數值
        String outChildID    = stmt.getString(1);
        Timestamp outDate    = stmt.getTimestamp(2);
        String outTherapist  = stmt.getString(3);
        int outClinicID      = stmt.getInt(4);
        // ... 後續業務邏輯使用輸出值

        return true;

    } catch (SQLException e) {
        e.printStackTrace();
        success = false;
    } finally {
        // 6. 釋放資源
        try { if (stmt != null) stmt.close(); } catch (SQLException ignore) {}
    }
    return success;
}

三、 關鍵注意事項

  1. 參數順序嚴格對應: JDBC 參數索引從 1 開始,必須與預存程序定義順序完全一致。
  2. INPUT/OUTPUT 雙向參數: 若參數需傳入值並接收回傳值,須先 setXxx() 再 registerOutParameter(),執行後用 getXxx() 取得新值。
  3. 資料型別對照: SQL VARCHAR ↔ Types.VARCHAR,DATETIME ↔ Types.TIMESTAMP,INT ↔ Types.INTEGER,CHAR(1) ↔ Types.CHAR 或 Types.VARCHAR。
  4. 驅動程式版本: 建議使用 Microsoft JDBC Driver for SQL Server (mssql-jdbc) 9.0+,支援 JDBC 4.2+、資料表值參數、Always Encrypted 等新特性。
  5. 連線池: 生產環境請使用 HikariCP、DBCP2 等連線池,避免頻繁建立/關閉連線。

四、 進階:取得回傳碼

stmt.registerOutParameter(9, Types.INTEGER); // 額外註冊 RETURN VALUE
stmt.execute();
int returnCode = stmt.getInt(9); // 取得 RETURN 0/錯誤碼

若預存程序有 RETURN @ret,可在 CallableStatement 末尾額外註冊一個 Types.INTEGER 參數接收。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved