MySQl的存储过程,为啥使用SQLyog和使用Navicat的语法不一样呢?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQl的存储过程,为啥使用SQLyog和使用Navicat的语法不一样呢?相关的知识,希望对你有一定的参考价值。
SQLyog要使用DELIMITER关键字,而Navicat是不需要的,为什么呢?
navicat for mysql用查询代码写的时候也是需要加delimiter的 参考技术A navicat编辑器里把delimiter都隐藏了,让你关注具体逻辑就行了,不必纠缠于语法问题PHP MySQL - 为啥存储过程调用在 PHP 代码中意外结束
【中文标题】PHP MySQL - 为啥存储过程调用在 PHP 代码中意外结束【英文标题】:PHP MySQL - Why stored procedure call is ended unexpectedly in PHP codePHP MySQL - 为什么存储过程调用在 PHP 代码中意外结束 【发布时间】:2021-04-26 07:51:24 【问题描述】:我的存储过程有一个奇怪的问题。 我编写了一个在 MySQL 控制台和 MySQL GUI 工具上正确运行的存储过程:SqlYog。 但它不适用于 PHP 代码。 是否有任何特定设置可以在 PHP 中运行 SP?在我的存储过程中,我使用了 MySQL 会话变量。
我的环境:Windows 10 x64, PHP 7.3, MariaDB: 10.4.13-MariaDB
.
我附上了我的 SP 代码部分。
问题块如下:
SET @p_number = v_number;
SET @p_quantitySum = v_stock_net;
EXECUTE stmt1 USING @p_number, @p_quantitySum;
这是一个准备好的语句。
SET @sql_query = "
SELECT
@b_id := id,
@b_price := IFNULL(price, 0),
@b_ib_seq := seq,
@b_ib_qty_accumulated := IFNULL(quantitySum, 0)
FROM
(SELECT
ib.*,
(@seq := @seq + 1) AS seq,
@sum := (@sum + quantity) AS quantitySum
FROM
buying ib
INNER JOIN
(SELECT
@sum := 0,
@seq := 0) b
WHERE ib.number = ?
ORDER BY ib.date DESC) ib
WHERE quantitySum > ?
LIMIT 1 ;
" ;
PREPARE stmt1 FROM @sql_query ;
PHP 调用:mysqli_query($this->conn, "CALL sp_update_daily_buying('2021-01-21');")
我在循环中运行这个选择。执行EXECUTE stmt1 USING @p_number, @p_quantitySum;
后,我的存储过程在第三次执行后结束。
那是在循环中,2次是ok的,但是在第3次执行后,SP就结束了。
正如我上面提到的,在 GUI 工具和 MySQL 控制台中,它可以正常工作(循环正确结束)。
有什么具体的设置吗?
提前致谢!
【问题讨论】:
请发布运行它的 PHP 代码。 我猜你正在使用mysqli
而不是 multi-query
函数。 ;
是单独的语句。我不认为您可以准备/参数化多查询。
@TangentiallyPerpendicular,更新了一篇文章
@user3783243,我用的是mysqi,但不是多查询。但我每次都运行一个查询。其他查询也运行良好。
SET @p_number = v_number;
是第一个查询,SET @p_quantitySum = v_stock_net;
是第二个查询。请出示相关PHP
【参考方案1】:
我可以在几个小时内修复这个错误。
原因是我在存储过程中使用了多个没有变量赋值或 INSERT 的 SELECT 语句。所以存储过程在执行后返回了多个结果集,这使得 PHP 函数mysqli_query
无法正确处理。
我找不到如何在 PHP 中处理这种情况的解决方案。也许mysqli_multi_query
可以解决这个问题。
但在存储过程中,我通过添加变量赋值稍微更改了多个选择语句。最后,我可以开始工作了。
SELECT
id,
price,
seq,
quantitySum
INTO @vb_id, @vb_price, @vb_ib_seq, @vb_ib_qty_accumulated
FROM
(SELECT
ib.*,
(@seq := @seq + 1) AS seq,
@sum := (@sum + quantity) AS quantitySum
FROM
item_buying ib
INNER JOIN
(SELECT
@sum := 0,
@seq := 0) b
WHERE ib.number = ?
ORDER BY ib.date DESC) ib
WHERE quantitySum > ?
LIMIT 1
或者我们可以使用临时内存表从 select 中获取结果集,而不是使用会话变量。
【讨论】:
以上是关于MySQl的存储过程,为啥使用SQLyog和使用Navicat的语法不一样呢?的主要内容,如果未能解决你的问题,请参考以下文章
PHP MySQL - 为啥存储过程调用在 PHP 代码中意外结束
SQLyog和MySQL啥关系,这个sqlyog有图形界面,mysql没有,怎么回事啊
安装了sqlyog,没有mysql文件夹和服务,sqlyog也连接不了怎么办?
使用MySQL可视化客户端,例如SQLyog,Navicat等,只编写SQL语句,使用2的N次方原理,快速初始化百万千万条数据