davafy 2015-09-25 18:15:15 8852次浏览 0条评论 3 5 0

最近在做yii2调用mysql存储过程并接收返回值的功能,网上搜到的资料比较零散(也许最大的原因是我不太会搜(。﹏。*)。)但是最终总算把这个功能给搞出来了,特此记录一下,如果有遇到同样需求的战友可以参考一下,下面贴出调用的php代码:

$reg = "davafy@davafy.com";
$cmd = Yii::$app->db->createCommand("call test1(:reg,@s)");
$cmd->bindParam(':reg',$reg,\PDO::PARAM_STR,50);
$res = $cmd->queryOne();
$s = Yii::$app->db->createCommand("select @s");
$ret = $s->queryOne();

mysql的存储过程名称是test1,有两个参数:IN reg varchar(50)和OUT s int,reg是php程序传给test1的输入参数,s是存储过程需要返回给php的值。

$cmd = Yii::$app->db->createCommand("call test1(:reg,@s)");
$cmd->bindParam(':reg',$reg,\PDO::PARAM_STR,50);

这里第一句代码是调用test1存储过程,第二句绑定参数。PS:要绑定的参数在调用存储过程时用:variable表示,然后用bindParam绑定就可以把想传递的参数传进test1。@s是输出参数,调用的时候写成@variable这种形式就可以了,以供下面的代码取得@s的值。

$res = $cmd->queryOne();

这句代码执行调用test1存储过程。
比如存储过程里最后有一句:select from tableName;那么$res获得的结果就是这句查询语句的结果。这里有个小的注意的地方,如果存储过程有多句查询语句,比如select from tableName1;select from tableName2;select from tableName3;那么在mysql命令行里调用test1可以获得这几个查询条件的结果,但是这里用$cmd->queryAll();调用也只能得到tableName1的查询结果,所以最后我还是用了queryOne()这也能满足我饥渴的需要了,哪位战友有yii2的获取多个结果集的方法希望可以分享一下!

$s = Yii::$app->db->createCommand("select @s");
$ret = $s->queryOne();

这段代码就是再次执行mysql命令,获取test1的out参数s的值,查询出来之后赋值给$ret。
这样这段php代码就可以得到一个输出结果集和输出参数了。

下面再贴一段试用这段php代码的mysql存储过程给大家参考:

mysql> DELIMITER //  
mysql> CREATE PROCEDURE test1(IN reg varchar(50),OUT s int)  
    -> BEGIN 
    -> SELECT COUNT(*) INTO s FROM user;  
    -> SELECT * FROM code WHERE regcode=reg;
    -> END 
    -> //  
mysql> DELIMITER ; 

用前面那段php代码调用的话就可以获取输出结果集和输出参数s了。

还有一点让我之前蛋疼了一阵子的是,我用的navicat创建的存储过程,流程如下图。。群。。图群,就是好多张图。。

输入图片说明

输入图片说明

输入图片说明

这里需要把varchar的长度也自己填上,不然保存会报错,总是保存不了

输入图片说明

由于本人水平相当有限,有什么问题还望大家批评指正,感激不尽!

原创:davafy 转载请注明作者及出处

觉得很赞
    没有找到数据。
您需要登录后才可以评论。登录 | 立即注册