MySQL 存儲過程封裝業務邏輯、減少網絡交互。本文提供 PHP 5.x + MySQL 5.x 環境下,四類參數模式的完整調用代碼實例。
$conn = mysql_connect('localhost', 'root', 'root') or die('連接失敗');
mysql_select_db('test', $conn);
mysql_query("SET NAMES utf8");
-- 創建
$sql = "
CREATE PROCEDURE myproc()
BEGIN
INSERT INTO user (id, username, sex) VALUES (NULL, 's', '0');
END";
mysql_query($sql);
-- 調用
mysql_query("CALL test.myproc()");
-- 執行後 user 表新增一行
-- 創建:判斷分數及格
$sql = "
CREATE PROCEDURE myproc2(IN score INT)
BEGIN
IF score >= 60 THEN
SELECT 'pass';
ELSE
SELECT 'no';
END IF;
END";
mysql_query($sql);
-- 調用
mysql_query("CALL test.myproc2(70)");
-- 結果集需在命令行或 mysqli_multi_query 中查看
-- 創建:設置輸出值
$sql = "
CREATE PROCEDURE myproc3(OUT score INT)
BEGIN
SET score = 100;
END";
mysql_query($sql);
-- 調用:用戶變量 @score 接收
mysql_query("CALL test.myproc3(@score)");
$result = mysql_query("SELECT @score");
$row = mysql_fetch_array($result);
print_r($row); // Array ( [0] => 100 [@score] => 100 )
-- 創建:根據性別標誌查詢用戶
$sql = "
CREATE PROCEDURE myproc4(INOUT sexflag INT)
BEGIN
SELECT * FROM user WHERE sex = sexflag;
END";
mysql_query($sql);
-- 調用:先設置會話變量
mysql_query("SET @sexflag = 1");
mysql_query("CALL test.myproc4(@sexflag)");
// 結果集直接返回,可在 mysql 客戶端查看
mysql_*,改用 mysqli 或 PDO:$mysqli = new mysqli('localhost','root','root','test');$mysqli->multi_query("CALL proc(); SELECT @out;") 配合 next_result()。$stmt = $mysqli->prepare("CALL proc(?,?)"); $stmt->bind_param('i', $in); $stmt->bind_result($out);mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 拋出異常替代 die()。| 優點 | 缺點 |
|---|---|
| 減少網絡往返 | 調試困難(無 IDE 斷點) |
| 邏輯集中、權限控制 | 版本控制/代碼審查弱 |
| 減少應用層 SQL 拼接風險 | 業務邏輯分散在 DB 層,擴展性受限 |
建議:核心高頻事務邏輯用存儲過程,複雜業務規則留在應用層。