本系列最後一篇展示如何在 Java 代碼中通過 JDBC 動態創建存儲過程,並立即調用執行。適用於需要運行時動態定義數據庫邏輯的場景(如多租戶動態報表、動態分區維護等)。
import java.sql.*;
public class ProcedureTest {
public static void main(String args[]) throws Exception {
// 1. 加載驅動 (此處為 JDBC-ODBC Bridge,實際請用對應數據庫驅動)
DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
// 2. 獲取連接
Connection conn = DriverManager.getConnection("jdbc:odbc:mydata", "sa", "");
// 3. 創建 Statement 執行 DDL
Statement stmt = conn.createStatement();
// 動態創建存儲過程:查詢學生成績表所有數據
stmt.executeUpdate("create procedure OOP as select * from 學生成績表");
// 4. 準備調用
CallableStatement c = conn.prepareCall("{call OOP}");
// 5. 執行查詢並處理結果集
ResultSet rs = c.executeQuery();
while (rs.next()) {
String chinese = rs.getString("Chinese");
System.out.println(chinese);
}
// 6. 關閉資源
conn.close();
}
}
{call 過程名}。executeQuery() 獲取 ResultSet 迭代。finally 塊中關閉 Connection/Statement/ResultSet,避免洩漏。DataSource (如 HikariCP) 替代 DriverManager 獲取連接。com.mysql.cj.jdbc.Driver,PostgreSQL: org.postgresql.Driver 等),而非 JDBC-ODBC Bridge(已淘汰)。適用:動態報表引擎、運行時創建分區/索引維護過程、多租戶隔離邏輯動態部署。
風險:DDL 操作需高權限、難以版本控制、可能導致數據庫鎖定、SQL 注入風險(若動態拼接 SQL)。建議嚴格控制使用範圍,並做好審計日誌。
本系列七篇文章系統講解了 JDBC 調用存儲過程的各類場景:
| 篇次 | 主題 | 關鍵技術點 |
|---|---|---|
| 一 | 無輸出參數 | CallableStatement 基礎調用、IN 參數設置 |
| 二 | 帶輸出參數 | registerOutParameter、getInt/getString 獲取 OUT 參數、游標處理 |
| 三 | 刪除數據 | 外鍵級聯刪除、事務性執行 |
| 四 | 修改數據 | UPDATE 存儲過程、參數綁定 |
| 五 | 模糊查詢 | LIKE 模糊匹配、字符串拼接參數 |
| 六 | 增加數據 | INSERT 存儲過程、批量操作思路 |
| 七 | 動態創建並調用 | Statement.executeUpdate 創建過程、即時調用 |
掌握這些模式,能應對絕大多數 Java 應用與關係型數據庫存儲過程交互的需求。