本文实例讲述了mysql存储过程之返回多个值的方法。分享给大家供大家参考,具体如下:

mysql存储函数只返回一个值。要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程。咱们先来看一个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, resolved 和 disputed。 在存储过程中,使用带有count函数的select语句根据订单状态获取相应的订单总数,并将其分配给相应的参数。按着上面的sql,我们如果要使用get_order_by_cust存储过程,可以传递客户编号和四个用户定义的变量来获取输出值。执行存储过程后,我们再使用SELECT语句输出变量值:

+----------+-----------+-----------+-----------+

| @shipped | @canceled | @resolved | @disputed |

+----------+-----------+-----------+-----------+

| 22 | 0 | 1 | 1 |

+----------+-----------+-----------+-----------+

1 row in set

结合实际应用,我们再来看下从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相关内容感兴趣的读者可查看本站专题:《MySQL存储过程技巧大全》、《MySQL常用函数大汇总》、《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》及《MySQL数据库锁相关技巧汇总》

希望本文所述对大家MySQL数据库计有所帮助。

mysql存储过程返回多个值_数据库mysql存储过程之返回多个值的方法示例相关推荐

  1. mysql以下日期函数正确的_[数据库]MYSQL基础03(日期函数)

    [数据库]MYSQL基础03(日期函数) 0 2015-10-29 01:00:09 工作中对日期的处理是经常遇到的,需求可能多种多样,因此重点介绍. 1.获取当前日期select NOW()-- 结 ...

  2. mysql查出倒序第一条数据_[数据库]mysql 记录根据日期字段倒序输出

    [数据库]mysql 记录根据日期字段倒序输出 0 2016-07-21 11:00:17 我们知道倒序输出是很简单的 select * from table order by id desc 直接这 ...

  3. mysql交叉表的构造知识_[数据库]MySQL交叉表

    [数据库]MySQL交叉表 0 2012-01-11 17:00:23 在某些数据库中有交叉表,但在MySQL中却没有这个功能,但网上看到有不少朋友想找出一个解决方法,特发贴集思广义. http:// ...

  4. mysql怎么将成绩划分等级_数据库mysql中case如何给成绩划分等级?

    在表格中如果我们要给不同分段的成绩评选等级,只需要使用筛选功能输入评定的条件即可.那么在mysql中我们该如何输出跟表格一样结果呢?这里有的小伙伴说可以用我们刚学习的case函数来尝试.但是作为最基础 ...

  5. mysql的on和in用法_数据库中in、on、with的用法及示例。

    with用法: 创建一个表: create table regr (pid integer,id integer, name char(20)) alter table regr alter id s ...

  6. mysql清空数据库所有表的命令_mysql清空表数据命令是什么?_数据库,mysql,清空表数据...

    mysql服务无法启动怎么解决_数据库 mysql服务无法启动的解决方法是:1.配置环境变量:2.在mysql安装目录下,新建my.ini文件,设置默认字符集.端口.存储引擎等:3.执行[mysqld ...

  7. mysql权限层级体系_数据库mysql有哪些权限?层级有哪些?

    我们想要运行一个文件时,有时候会出现只有管理员才能打开这类软件,这就是权限对于用户的限制.那么在我们最近学习的数据库mysql中,也有这样的权限需要我们去注意吗?小编想说当然有,而且还不少!今天就数据 ...

  8. dapper 调用 存储过程返回值_数据库事务、存储过程、函数以及触发器之间的区别和联系...

    一.[事务概念] 事务(Transaction)是指构成单一逻辑工作单元的操作集合,要么完整地执行,要么完全不执行. 1,如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前 ...

  9. mysql存储过程出参和入参_数据库mysql存储中的入参出参理解

    在使用语句的时候,不可避免的要考虑参数的问题,而参数又是用来辅助变量的.有些小伙伴看到我们标题中的入参形参不知道是什么意思,其实也不难理解.我们把出参和入参看成输入和输出的意思就可以了.想必这样说大家 ...

最新文章

  1. github报错“remote: Support for password authentication was removed on August 13, 2021. Please use a p”
  2. PCB上走100A电流的方法
  3. VC内存泄露检查工具:Visual Leak Detector
  4. fragment 调用activity方法,如dispatchKeyEvent,dispatchTouchEvent
  5. 安装redis,执行make test时遇到You need tcl 8.5 or newer in order to run the Redis test
  6. Linux驱动(11)--生成设备节点
  7. MDF文件在SQL Server数据库中恢复技术
  8. python面试题之如何读取大文件
  9. spark页面单跳转化率
  10. 计量分析类论文如何创新-化柏林
  11. CV2.imread得到的图像显示成蓝色的原因和3种BGR转RGB的方法
  12. libfaac个个参数说明
  13. window上安装fasttext
  14. google关键词查询
  15. 软考中级-嵌入式系统设计师
  16. HTML小白学习-1.0
  17. github上很好的iOS资源集锦
  18. iwatch表盘壁纸图片_iwatch壁纸大全卡西欧表盘app
  19. NTT(快速数论变换)模板
  20. 高新技术企业认定条件

热门文章

  1. 计算机原理与应用简称,基础知识-计算机原理与应用.ppt
  2. 锁具行业电子工程师岗位职责_赏金猎人招募电子产品开发工程师产品结构工程师...
  3. yaml报错TypeError: load() missing 1 required positional argument: ‘Loader‘
  4. android 组合属性动画,Android属性动画组合(sequence串行、together并行)
  5. excel 复制数据 sql server 粘贴_win32 实现 excel 快速复制粘贴
  6. java json 解析null_解析包含null的原始json数组
  7. 8个超震撼的HTML5和纯CSS3动画源码
  8. javaweb可部署目录结构
  9. java 里面eaquls和==区别
  10. asp.net ViewState详解