首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 調用 Oracle、MySQL、SQL Server 存儲過程完整實戰指南

     編輯:PHP 相關知識

存儲過程調用統一架構

不同數據庫的存儲過程調用語法差異較大,本文匯總三大主流數據庫在 PHP 中的調用方式。

Oracle 存儲過程調用

PL/SQL 定義

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;

PHP OCI8 調用


MySQL 存儲過程調用

存儲過程定義

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 ;

PHP 調用

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());
?>

SQL Server 存儲過程調用

存儲過程定義

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

PHP mssql 擴展調用(舊版)


PHP PDO_SQLSRV 調用(現代推薦)

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

最佳實踐建議

  1. 統一封裝:建立 DatabaseProcedure 基類,屏蔽底層差異
  2. 參數驗證:調用前驗證輸入參數類型、長度、範圍
  3. 異常處理:捕獲數據庫異常,轉換為業務異常
  4. 性能監控:記錄存儲過程執行時間,識別慢調用
  5. 安全審計:記錄敏感操作的調用日誌

通用調用封裝示例

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;
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved