mysql存儲過程之返回多個值的方法示例
本文實例講述了mysql存儲過程之返回多個值的方法。分享給大家供大家參考,具體如下:
mysql存儲函數(shù)只返回一個值。要開發(fā)返回多個值的存儲過程,需要使用帶有INOUT或OUT參數(shù)的存儲過程。咱們先來看一個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
然后嘞,咱們來看一個存儲過程,它接受客戶編號,并返回發(fā)貨(shipped),取消(canceled),解決(resolved)和爭議(disputed)的訂單總數(shù):
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參數(shù)之外,存儲過程還需要4個額外的OUT參數(shù):shipped, canceled, resolved 和 disputed。 在存儲過程中,使用帶有count函數(shù)的select語句根據(jù)訂單狀態(tài)獲取相應的訂單總數(shù),并將其分配給相應的參數(shù)。按著上面的sql,我們如果要使用get_order_by_cust存儲過程,可以傳遞客戶編號和四個用戶定義的變量來獲取輸出值。執(zhí)行存儲過程后,我們再使用SELECT語句輸出變量值:
+----------+-----------+-----------+-----------+ | @shipped | @canceled | @resolved | @disputed | +----------+-----------+-----------+-----------+ | 22 | 0 | 1 | 1 | +----------+-----------+-----------+-----------+ 1 row in set
結合實際應用,我們再來看下從PHP程序中調用返回多個值的存儲過程:
<?php /** * Call stored procedure that return multiple values * @param $customerNumber */ function call_sp($customerNumber) { try { $pdo = new PDO("mysql:host=localhost;dbname=yiibaidb", '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);
上述代碼中,在@符號之前的用戶定義的變量與數(shù)據(jù)庫連接相關聯(lián),因此它們可用于在調用之間進行訪問。
好啦,本次分享就到這里了。
更多關于MySQL相關內容感興趣的讀者可查看本站專題:《MySQL存儲過程技巧大全》、《MySQL常用函數(shù)大匯總》、《MySQL日志操作技巧大全》、《MySQL事務操作技巧匯總》及《MySQL數(shù)據(jù)庫鎖相關技巧匯總》
希望本文所述對大家MySQL數(shù)據(jù)庫計有所幫助。
相關文章
linux mysql 數(shù)據(jù)庫開啟外部訪問設置指南
Linux下設置MySQL和允許外部機器訪問,具體目錄是具體情況而定,有的人是安裝了在個人目錄下,則找到對應的目錄則可以2012-11-11什么是分表和分區(qū) MySql數(shù)據(jù)庫分區(qū)和分表方法
這篇文章主要為大家詳細介紹了MySql數(shù)據(jù)庫分區(qū)和分表方法,告訴大家什么是分表和分區(qū),mysql分表和分區(qū)有什么聯(lián)系,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02MySQL對JSON類型字段數(shù)據(jù)進行提取和查詢的實現(xiàn)
本文主要介紹了MySQL對JSON類型字段數(shù)據(jù)進行提取和查詢的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04