yii2 mysql 存储过程_Yii2调用mysql存储过程获取返回值

最近在做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创建的存储过程,流程如下图。。群。。图群,就是好多张图。。

cde4a3d7e605ca1eb8ff68a32149eb28.png

e34d0bd9ca81a6e6c89012b1522985a0.png

b6dcd2de14b63b0e160180bda201446e.png

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

d97eed476451c5d93f56c28c6fa1b9e3.png

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值