mysql存储过程之返回多个值的方法示例
本文实例讲述了mysql存储过程之返回多个值的方法。分享给大家供大家参考,具体如下:
mysql存储函数只返回一个值。要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程。咱们先来看一个orders表它的结构:
mysql>descorders; +----------------+-------------+------+-----+---------+-------+ |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|| +----------------+-------------+------+-----+---------+-------+ 7rowsinset
然后嘞,咱们来看一个存储过程,它接受客户编号,并返回发货(shipped),取消(canceled),解决(resolved)和争议(disputed)的订单总数:
DELIMITER$$ CREATEPROCEDUREget_order_by_cust( INcust_noINT, OUTshippedINT, OUTcanceledINT, OUTresolvedINT, OUTdisputedINT) BEGIN --shipped SELECT count(*)INTOshipped FROM orders WHERE customerNumber=cust_no ANDstatus='Shipped'; --canceled SELECT count(*)INTOcanceled FROM orders WHERE customerNumber=cust_no ANDstatus='Canceled'; --resolved SELECT count(*)INTOresolved FROM orders WHERE customerNumber=cust_no ANDstatus='Resolved'; --disputed SELECT count(*)INTOdisputed FROM orders WHERE customerNumber=cust_no ANDstatus='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| +----------+-----------+-----------+-----------+ 1rowinset
结合实际应用,我们再来看下从PHP程序中调用返回多个值的存储过程:
prepare($sql); $stmt->bindParam(':no',$customerNumber,PDO::PARAM_INT); $stmt->execute(); $stmt->closeCursor(); //executethesecondquerytogetvaluesfromOUTparameter $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("Erroroccurred:".$pe->getMessage()); } } call_sp(141);
上述代码中,在@符号之前的用户定义的变量与数据库连接相关联,因此它们可用于在调用之间进行访问。
好啦,本次分享就到这里了。
更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL存储过程技巧大全》、《MySQL常用函数大汇总》、《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》及《MySQL数据库锁相关技巧汇总》
希望本文所述对大家MySQL数据库计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。