各位用户为了找寻关于mysql存储过程之返回多个值的方法示例的资料费劲了很多周折。这里教程网为您整理了关于mysql存储过程之返回多个值的方法示例的相关资料,仅供查阅,以下为您介绍关于mysql存储过程之返回多个值的方法示例的详细内容
本文实例讲述了mysql存储过程之返回多个值的方法。分享给大家供大家参考,具体如下:
mysql存储函数只返回一个值。要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程。咱们先来看一个orders表它的结构:
? 1 2 3 4 5 6 7 8 9 10 11 12 13mysql>
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)的订单总数:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41DELIMITER $$
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, resolved 和 disputed。 在存储过程中,使用带有count函数的select语句根据订单状态获取相应的订单总数,并将其分配给相应的参数。按着上面的sql,我们如果要使用get_order_by_cust存储过程,可以传递客户编号和四个用户定义的变量来获取输出值。执行存储过程后,我们再使用SELECT语句输出变量值:
? 1 2 3 4 5 6+
----------+-----------+-----------+-----------+
| @shipped | @canceled | @resolved | @disputed |
+
----------+-----------+-----------+-----------+
| 22 | 0 | 1 | 1 |
+
----------+-----------+-----------+-----------+
1 row
in
set
结合实际应用,我们再来看下从PHP程序中调用返回多个值的存储过程:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30<?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);
上述代码中,在@符号之前的用户定义的变量与数据库连接相关联,因此它们可用于在调用之间进行访问。
好啦,本次分享就到这里了。
希望本文所述对大家MySQL数据库计有所帮助。
原文链接:https://blog.csdn.net/luyaran/article/details/80968547