循环遍历存储过程的 MySQL 结果
Looping through MySQL results from stored procedure
这里为了简单起见,我有以下SQL查询:
"SELECT id,name FROM employees WHERE birthdate<'$dymd'"
如果我想使用来自标准(非存储过程)查询的记录,代码如下所示:
$sql="SELECT id,name FROM employees WHERE birthdate<'$dymd'";
$rst=$mysqli->query($sql);
while($row=$rst->fetch_assoc())
{
...
}
$rst->free();
但是如果我将查询存储到存储过程中:
CREATE PROCEDURE GetEmployees(IN dymd DATE)
READS SQL DATA
BEGIN
SELECT id,name FROM employees WHERE birthdate<dymd;
END;
我无法使用之前的循环(我收到错误消息:"Commands out of sync; you can't run this command now")。我必须像这样循环:
$sql="CALL GetEmployees('$dymd')";
$rst=$mysqli->query($sql);
if($rst->num_rows)
{
do
{
$row=$rst->fetch_assoc();
...
}
while($mysqli->next_result());
$rst->free();
}
问题是为什么我需要在存储过程记录的情况下显式推送记录指针!?为什么 fetch_assoc() 不像以前那样为我做这件事?
更重要的是,上面的代码仅适用于每 PHP 页从存储过程中检索到的一个结果集。如果我在第二个存储过程的同一 PHP 页面上有两个存储过程(例如 CALL YoungEmployees() 和 CALL OldEmployees()),我会收到已经提到的错误消息。如果我使用标准查询(不是来自存储过程)那么它工作正常 - 两个结果集都正确显示在一页上!
根据@JurisGregov 的评论,解决方案是;
//first stored procedure
$sql1="CALL YoungEmployees('$dymd')";
if($rst1=$mysqli->query($sql1))
{
while($row1=$rst1->fetch_row())
{
...
}
$rst1->close();
$mysqli->next_result(); //!!!
}
//second stored procedure
$sql2="CALL OldEmployees('$dymd')";
if($rst2=$mysqli->query($sql2))
{
while($row2=$rst2->fetch_row())
{
...
}
$rst2->close();
$mysqli->next_result(); //!!!
}
这里为了简单起见,我有以下SQL查询:
"SELECT id,name FROM employees WHERE birthdate<'$dymd'"
如果我想使用来自标准(非存储过程)查询的记录,代码如下所示:
$sql="SELECT id,name FROM employees WHERE birthdate<'$dymd'";
$rst=$mysqli->query($sql);
while($row=$rst->fetch_assoc())
{
...
}
$rst->free();
但是如果我将查询存储到存储过程中:
CREATE PROCEDURE GetEmployees(IN dymd DATE)
READS SQL DATA
BEGIN
SELECT id,name FROM employees WHERE birthdate<dymd;
END;
我无法使用之前的循环(我收到错误消息:"Commands out of sync; you can't run this command now")。我必须像这样循环:
$sql="CALL GetEmployees('$dymd')";
$rst=$mysqli->query($sql);
if($rst->num_rows)
{
do
{
$row=$rst->fetch_assoc();
...
}
while($mysqli->next_result());
$rst->free();
}
问题是为什么我需要在存储过程记录的情况下显式推送记录指针!?为什么 fetch_assoc() 不像以前那样为我做这件事?
更重要的是,上面的代码仅适用于每 PHP 页从存储过程中检索到的一个结果集。如果我在第二个存储过程的同一 PHP 页面上有两个存储过程(例如 CALL YoungEmployees() 和 CALL OldEmployees()),我会收到已经提到的错误消息。如果我使用标准查询(不是来自存储过程)那么它工作正常 - 两个结果集都正确显示在一页上!
根据@JurisGregov 的评论,解决方案是;
//first stored procedure
$sql1="CALL YoungEmployees('$dymd')";
if($rst1=$mysqli->query($sql1))
{
while($row1=$rst1->fetch_row())
{
...
}
$rst1->close();
$mysqli->next_result(); //!!!
}
//second stored procedure
$sql2="CALL OldEmployees('$dymd')";
if($rst2=$mysqli->query($sql2))
{
while($row2=$rst2->fetch_row())
{
...
}
$rst2->close();
$mysqli->next_result(); //!!!
}