PHP MySQL - 为什么存储过程调用在 PHP 代码中意外结束
PHP MySQL - Why stored procedure call is ended unexpectedly in PHP code
我的存储过程有一个奇怪的问题。
我在 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');")
我 运行 这个 select 在循环中。执行 EXECUTE stmt1 USING @p_number, @p_quantitySum;
后,我的存储过程在第 3 次执行后结束。
就是在循环,2次还可以,但是第3次执行完,SP就结束了。
正如我上面提到的,在 GUI 工具和 MySQL 控制台中,它工作正常(循环正确结束)。
有没有具体的设置?
提前致谢!
我可以在几个小时内修复此错误。
原因是我在存储过程中使用了多个 SELECT 语句,这些语句没有变量赋值或 INSERT。所以存储过程在执行后返回了多个结果集,这使得 PHP 函数 mysqli_query
无法正确处理。
我在 PHP 中找不到如何处理这种情况的解决方案。也许 mysqli_multi_query
可以解决这个问题。
但在存储过程中,我通过添加变量赋值稍微更改了多个 selects 语句。终于,我可以开始工作了。
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
或者我们可以使用临时内存 table 从 select 中获取结果集,而不是使用会话变量。
我的存储过程有一个奇怪的问题。 我在 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');")
我 运行 这个 select 在循环中。执行 EXECUTE stmt1 USING @p_number, @p_quantitySum;
后,我的存储过程在第 3 次执行后结束。
就是在循环,2次还可以,但是第3次执行完,SP就结束了。
正如我上面提到的,在 GUI 工具和 MySQL 控制台中,它工作正常(循环正确结束)。
有没有具体的设置?
提前致谢!
我可以在几个小时内修复此错误。
原因是我在存储过程中使用了多个 SELECT 语句,这些语句没有变量赋值或 INSERT。所以存储过程在执行后返回了多个结果集,这使得 PHP 函数 mysqli_query
无法正确处理。
我在 PHP 中找不到如何处理这种情况的解决方案。也许 mysqli_multi_query
可以解决这个问题。
但在存储过程中,我通过添加变量赋值稍微更改了多个 selects 语句。终于,我可以开始工作了。
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
或者我们可以使用临时内存 table 从 select 中获取结果集,而不是使用会话变量。