MySQL存儲過程返回多個值

在本教學中,您將學習如何編寫/開發返回多個值的存儲過程。

MySQL存儲函數只返回一個值。要開發返回多個值的存儲過程,需要使用帶有INOUTOUT參數的存儲過程。

如果您不熟悉INPUTOUT參數的用法,請查看存儲過程參數教學的詳細資訊。

返回多個值的存儲過程示例

我們來看看示例資料庫(zaixiandb)中的orders表。

mysql> desc orders;
+----------------+-------------+------+-----+---------+-------+
| Field          | Type        | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+-------+
| orderNumber    | int(11)     | NO   | PRI | NULL    |       |
| orderDate      | date        | NO   |     | NULL    |       |
| requiredDate   | date        | NO   |     | NULL    |       |
| shippedDate    | date        | YES  |     | NULL    |       |
| status         | varchar(15) | NO   |     | NULL    |       |
| comments       | text        | YES  |     | NULL    |       |
| customerNumber | int(11)     | NO   | MUL | NULL    |       |
+----------------+-------------+------+-----+---------+-------+
7 rows in set

以下存儲過程接受客戶編號,並返回發貨(shipped),取消(canceled),解決(resolved)和爭議(disputed)的訂單總數。

DELIMITER $$

CREATE PROCEDURE get_order_by_cust(
 IN cust_no INT,
 OUT shipped INT,
 OUT canceled INT,
 OUT resolved INT,
 OUT disputed INT)
BEGIN
 -- shipped
 SELECT
            count(*) INTO shipped
        FROM
            orders
        WHERE
            customerNumber = cust_no
                AND status = 'Shipped';

 -- canceled
 SELECT
            count(*) INTO canceled
        FROM
            orders
        WHERE
            customerNumber = cust_no
                AND status = 'Canceled';

 -- resolved
 SELECT
            count(*) INTO resolved
        FROM
            orders
        WHERE
            customerNumber = cust_no
                AND status = 'Resolved';

 -- disputed
 SELECT
            count(*) INTO disputed
        FROM
            orders
        WHERE
            customerNumber = cust_no
                AND status = 'Disputed';

END

IN參數之外,存儲過程還需要4個額外的OUT參數:shipped, canceled, resolveddisputed。 在存儲過程中,使用帶有COUNT函數SELECT語句根據訂單狀態獲取相應的訂單總數,並將其分配給相應的參數。

要使用get_order_by_cust存儲過程,可以傳遞客戶編號和四個用戶定義的變數來獲取輸出值。

執行存儲過程後,使用SELECT語句輸出變數值。

+----------+-----------+-----------+-----------+
| @shipped | @canceled | @resolved | @disputed |
+----------+-----------+-----------+-----------+
|       22 |         0 |         1 |         1 |
+----------+-----------+-----------+-----------+
1 row in set

從PHP調用返回多個值的存儲過程

以下代碼片段顯示如何從PHP程式中調用返回多個值的存儲過程。

<?php
/**
 * Call stored procedure that return multiple values
 * @param $customerNumber
 */
function call_sp($customerNumber)
{
    try {
        $pdo = new PDO("mysql:host=localhost;dbname=zaixiandb", 'root', '123456');

        // execute the stored procedure
        $sql = 'CALL get_order_by_cust(:no,@shipped,@canceled,@resolved,@disputed)';
        $stmt = $pdo->prepare($sql);

        $stmt->bindParam(':no', $customerNumber, PDO::PARAM_INT);
        $stmt->execute();
        $stmt->closeCursor();

        // execute the second query to get values from OUT parameter
        $r = $pdo->query("SELECT @shipped,@canceled,@resolved,@disputed")
                  ->fetch(PDO::FETCH_ASSOC);
        if ($r) {
            printf('Shipped: %d, Canceled: %d, Resolved: %d, Disputed: %d',
                $r['@shipped'],
                $r['@canceled'],
                $r['@resolved'],
                $r['@disputed']);
        }
    } catch (PDOException $pe) {
        die("Error occurred:" . $pe->getMessage());
    }
}

call_sp(141);

@符號之前的用戶定義的變數與資料庫連接相關聯,因此它們可用於在調用之間進行訪問。

在本教學中,我們向您展示了如何編寫/開發返回多個值的存儲過程以及如何從PHP調用它。


上一篇: MySQL存儲過程 下一篇: MySQL視圖