應用程式需透過 JDBC 呼叫 SQL Server 預存程序,並取得輸出參數(OUTPUT)作為業務邏輯判斷依據。本文展示完整的 SQL 建立腳本與 Java 程式碼範例。
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
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;
}
setXxx() 再 registerOutParameter(),執行後用 getXxx() 取得新值。VARCHAR ↔ Types.VARCHAR,DATETIME ↔ Types.TIMESTAMP,INT ↔ Types.INTEGER,CHAR(1) ↔ Types.CHAR 或 Types.VARCHAR。stmt.registerOutParameter(9, Types.INTEGER); // 額外註冊 RETURN VALUE
stmt.execute();
int returnCode = stmt.getInt(9); // 取得 RETURN 0/錯誤碼
若預存程序有 RETURN @ret,可在 CallableStatement 末尾額外註冊一個 Types.INTEGER 參數接收。