错误1064在单个语句中多次调用存储过程


Error 1064 with multiple calls to stored procedure in single statement

我正在改进一个web应用程序的数据导入性能,其中有一件事极大地提高了性能,那就是将数据库相关的逻辑从服务器端代码移植到数据库中的存储过程和函数中。

此外,在处理大量类似查询时,将它们分批排队,以便稍后在单个SQL事务中执行,可以显著减少导入过程的瓶颈。


不幸的是,我遇到了一个问题,由于某种原因,我不能在单个SQL命令中多次调用存储过程。

以这个SQL为例,我连续两次调用LegacyUpdateProduct来展示我的问题。

存储过程接受一些带有数据的参数,不返回结果集,并且out给出具有行ID的@ID变量,在本例中我们不需要行ID。

CALL LegacyUpdateProduct(92,'00010','ADAISD 345',18.81,'91020200','FSB92','GS8219','FSB92',TRUE,2,3,0,0,@ID);CALL LegacyUpdateProduct(277,'0002335600','TPASD 987',6.04,'0 002 335 ','UX79','','',TRUE,2,3,0,0,@ID);
PHP

在PHP中,任何人都希望简单地运行查询,调用LegacyUpdateProduct,一切都会好起来的。

$sql = "CALL LegacyUpdateProduct(92,'00010','ADAISD 345',18.81,'91020200','FSB92','GS8219','FSB92',TRUE,2,3,0,0,@ID);CALL LegacyUpdateProduct(277,'0002335600','TPASD 987',6.04,'0 002 335 ','UX79','','',TRUE,2,3,0,0,@ID);"
# With Code Igniter
$this->db->query($sql);
# Or with raw PHP
mysqli_query($this->db->conn_id, $sql);

遗憾的是,情况并非如此。使用Code Igniter或普通PHP运行此查询将抛出SQL错误。

注意:我对数据进行了细致的梳理,并使用Code Igniter DB转义机制来生成更安全的查询。

错误编号:1064 SQL语法错误

最有趣的是,当我在PHPMyAdmin或MySQL Workbench中复制和粘贴所谓的错误SQL时,它运行顺利,没有错误或警告。

实际上,在PHPMyAdmin和MySQL Workbench中,我能够在单个查询中运行多达50个连续调用LegacyUpdateProduct而不会出现问题。

我已经通过谷歌和SO查看了可能相关或在某种程度上有帮助的问题,但没有发现太多的问题,除了这可能是某种类型的Code Igniter错误,但即使是普通的PHP我也发现了同样的问题。

在回答另一个有点相关的SO问题时,它提到这可能是Code Igniter的错误,但是它没有解释为什么使用普通PHP mysqli_query()查询失败。

在另一个问题的注释中,对于一个不同的错误,提示可能存在并发性问题,如果不等待前一个过程完成,就不能对该过程进行顺序调用。我对MySQL并发性没有足够的了解,但是,查询中的每个命令不应该在前一个命令之后执行吗?

帮助吗?

在PHP中,任何人都希望简单地使用两个调用

来运行查询。

不存在"两次调用查询"这样的事情。您实际上拥有的是两个SQL查询。而mysqli::query每次调用只能运行一个SQL查询。

在处理大量类似查询时,将它们分批排队,以便稍后在单个SQL命令中执行,可以显著减少导入过程的瓶颈。

很可能是innodb的偏执模式。要么关闭它,要么将更新封装在事务中。您将看到单独的query()调用没有明显的减少。