承接基礎篇,本文深入探討兩類進階場景:帶返回狀態的儲存程序與帶更新計數的儲存程序,並示範如何透過 `CallableStatement` 正確處理輸出參數與影響行數。
{[?=]call procedure-name[([parameter][,[parameter]]...)]}
-- 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
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();
}
}
-- 建表與儲存程序
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;
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();
}
}