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

Error 1064 with multiple calls to stored procedure in single statement

我正在努力提高 Web 应用程序的数据导入性能,并且已经大大提高了性能的一件事是将与数据库相关的逻辑从服务器端代码移植到数据库中的存储过程和函数中。

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


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

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

SQL

存储过程接受一些带数据的参数,不 return 结果集,并且输出给出带有行 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 转义机制来生成更安全的查询。

Error Number: 1064 You have an error in your SQL syntax

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

实际上,在 PHPMyAdmin 和 MySQL [=75] 中,我能够在单个查询中 运行 多达五十个连续调用 LegacyUpdateProduct 而没有问题=].

我已经查看了 Google 和 SO 以寻找可能相关或有帮助的问题,但没有发现太多可以继续的问题,除了这可能是某种代码点火器错误,但即使使用普通 PHP 我也发现了同样的问题。

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

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

帮忙?

In PHP anyone would expect to simply run the query with the two calls

没有 "query with two calls" 这样的东西。您实际上拥有的是 两个 SQL 查询 。虽然 mysqli::query 每次调用只能 运行 一个 SQL 查询。

when dealing with large amounts of similar queries, queuing them in batches to later be executed in a single SQL command, provided a noticeable decrease in the bottleneck of the import process.

很可能是 famous innodb's paranoid mode。要么将其关闭,要么将您的更新包装在事务中。您将看到单独的 query() 调用没有明显减少。