不同數據庫的存儲過程調用語法差異較大,本文匯總三大主流數據庫在 PHP 中的調用方式。
CREATE OR REPLACE PROCEDURE check_login(
p_user IN VARCHAR2,
p_pass IN VARCHAR2,
p_result OUT VARCHAR2
) AS
BEGIN
SELECT 'SUCCESS' INTO p_result
FROM users
WHERE username = p_user AND password = p_pass;
EXCEPTION
WHEN NO_DATA_FOUND THEN
p_result := 'FAILED';
END;
DELIMITER //
CREATE PROCEDURE in_out(IN uid INT)
BEGIN
SET @msg = 'hello';
SELECT *, @msg AS msg
FROM manage_loginhistory
WHERE h_uid = uid;
END //
DELIMITER ;
query($sql);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
print_r($row);
// 方法二:多結果集處理
$stmt = $pdo->prepare("CALL in_out(?)");
$stmt->execute([39]);
do {
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
if ($rows) {
print_r($rows);
}
} while ($stmt->nextRowset());
?>
CREATE PROCEDURE test_login
@user_name VARCHAR(30),
@password VARCHAR(30),
@info VARCHAR(100) OUTPUT
AS
BEGIN
SELECT @info = CASE
WHEN EXISTS(SELECT 1 FROM users WHERE name=@user_name AND pwd=@password)
THEN 'LOGIN_SUCCESS' ELSE 'LOGIN_FAILED' END;
END
prepare($sql);
$stmt->bindParam(1, $user_name, PDO::PARAM_STR, 30);
$stmt->bindParam(2, $password, PDO::PARAM_STR, 30);
$stmt->bindParam(3, $info, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 100);
$stmt->execute();
echo "返回信息: $info";
?>
| 特性 | Oracle (OCI8) | MySQL (PDO) | SQL Server (PDO_SQLSRV) |
|---|---|---|---|
| 調用語法 | BEGIN proc(:in, :out); END; | CALL proc(?, ?) | {CALL proc(?, ?)} |
| 輸入參數綁定 | oci_bind_by_name(:name, $var, len) | bindParam(1, $var, PDO::PARAM_STR) | bindParam(1, $var, PDO::PARAM_STR) |
| 輸出參數綁定 | oci_bind_by_name(:name, $var, len) | 自動通過 nextRowset() | bindParam(3, $var, PARAM_INPUT_OUTPUT) |
| 多結果集 | 需游標/REF CURSOR | $stmt->nextRowset() | $stmt->nextRowset() |
| 事務控制 | oci_commit/rollback | $pdo->commit/rollBack | $pdo->commit/rollBack |
pdo = $pdo;
}
public function call($procName, array $inParams, array $outParams = []) {
$placeholders = implode(',', array_fill(0, count($inParams), '?'));
$sql = "CALL $procName($placeholders)";
$stmt = $this->pdo->prepare($sql);
foreach ($inParams as $i => $val) {
$stmt->bindValue($i + 1, $val);
}
$stmt->execute();
$results = [];
do {
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
if ($rows) $results[] = $rows;
} while ($stmt->nextRowset());
return $results;
}
}