MySQL 用戶自定義函數(UDF)限制:只能返回單一標量值。需執行多條 SQL、返回多個結果集時,必須使用存儲過程。
PREPARE stmt FROM @sql_str:預處理動態 SQLEXECUTE stmt:執行預處理語句,產生結果集DEALLOCATE PREPARE stmt:釋放預處理資源(防洩漏)EXECUTE 產生一個結果集,調用端按序獲取| 方法 | 說明 |
|---|---|
stmt.execute() | 執行,返回是否有第一個結果集 |
stmt.getResultSet() | 獲取當前結果集 |
stmt.getMoreResults() | 移動到下一個結果集,返回是否存在 |
stmt.getUpdateCount() | 若非查詢,獲取影響行數 |
原則: 動態 SQL 僅用於**表名/列名/庫名**等無法參數化的標識符,**數值/字符串參數必須用預處理佔位符 ?**。
| 特性 | 存儲過程 | 用戶自定義函數 (UDF) |
|---|---|---|
| 返回結果集 | 支持多個 | 不支持(單標量值) |
| 事務控制 | 支持 COMMIT/ROLLBACK | 不支持 |
| 動態 SQL | 支持 PREPARE/EXECUTE | 禁止 |
| 調用方式 | CALL proc() | SELECT func() |
| OUT 參數 | 支持多個 | 不支持 |
| 適用場景 | 複雜流程、批量操作、多結果集 | 計算、格式化、標量查詢 |
execute → getResultSet → getMoreResults 循環EXECUTE 權限存儲過程是 MySQL 實現「單次調用、多結果集、動態 SQL、事務控制」的核心工具。文中示例展示了 PREPARE/EXECUTE 動態執行與 Java CallableStatement 多結果集遍歷的標準模式。**謹慎使用動態 SQL,嚴防注入,善用參數化**,才能安全發揮存儲過程的威力。