透過 JDBC CallableStatement 調用預存程序是企業級應用常見需求。本文系統整理七大場景:無輸出參數、輸出 INT/VARCHAR、游標回傳、刪除/修改/查詢/新增資料、Java 動態建立並調用,附完整 SQL 與 Java 程式碼。
sun.jdbc.odbc.JdbcOdbcDriver(舊版示範,實際建議用對應原生驅動)。jdbc:odbc:mydata。CREATE PROCEDURE getsum @n INT = 0 AS
DECLARE @sum INT, @i INT
SET @sum = 0; SET @i = 0
WHILE @i <= @n BEGIN SET @sum = @sum + @i; SET @i = @i + 1 END
PRINT 'the sum is ' + LTRIM(RTRIM(STR(@sum)))
CallableStatement c = conn.prepareCall("{call getsum(?)}");
c.setInt(1, 100);
c.execute();
ALTER PROCEDURE getsum @n INT = 0, @result INT OUTPUT AS
-- 計算邏輯同前 --
SET @result = @sum
CallableStatement c = conn.prepareCall("{call getsum(?,?)}");
c.setInt(1, 100);
c.registerOutParameter(2, Types.INTEGER);
c.execute();
System.out.println(c.getInt(2));
CREATE PROCEDURE CursorIntoProcedure @pname VARCHAR(8000) OUTPUT AS
DECLARE cur CURSOR FOR SELECT orderid FROM orders
DECLARE @v VARCHAR(5)
OPEN cur; SET @pname = ''
FETCH NEXT FROM cur INTO @v
WHILE @@FETCH_STATUS = 0 BEGIN
SET @pname = @pname + ';' + @v
FETCH NEXT FROM cur INTO @v
END
CLOSE cur; DEALLOCATE cur
CallableStatement c = conn.prepareCall("{call CursorIntoProcedure(?)}");
c.registerOutParameter(1, Types.VARCHAR);
c.execute();
System.out.println(c.getString(1));
| 操作 | SQL 關鍵點 | Java 關鍵 API |
|---|---|---|
| 刪除 | DELETE ... WHERE StuID=@StuID,配合外鍵級聯 | c.setInt(1, id); c.execute(); 再查詢驗證 |
| 修改 | UPDATE ... SET StuName=@StuName WHERE StuID=@StuID | c.setInt(1, id); c.setString(2, name); c.execute(); |
| 查詢(模糊) | SELECT ... WHERE customerid LIKE '%'+@cust+'%' | c.setString(1, "Tom"); ResultSet rs = c.executeQuery(); |
| 新增 | INSERT INTO ... VALUES(@StuID,@StuName,@StuAddress) | c.setInt(1,6); c.setString(2,"Liu"); c.setString(3,"wuhan"); c.execute(); |
Statement stmt = conn.createStatement();
stmt.executeUpdate("CREATE PROCEDURE OOP AS SELECT * FROM 學生成績表");
CallableStatement c = conn.prepareCall("{call OOP}");
ResultSet rs = c.executeQuery();
while (rs.next()) System.out.println(rs.getString("Chinese"));
setXxx(IN)先於 registerOutParameter(OUT)。ResultSet → Statement → Connection 依序關閉,建議用 try-with-resources。com.microsoft.sqlserver.jdbc.SQLServerDriver),避免 ODBC 橋接效能損耗。掌握 CallableStatement 的 IN/OUT/INOUT 參數綁定、游標處理、結果集讀取,能高效實現 Java 與資料庫預存程序的無縫整合,提升資料層效能與安全性。