gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 20:28:02 25 4
gpt4 key购买 nike

我正在致力于提高 Web 应用程序的数据导入性能,而性能显着提高的一件事是将数据库相关逻辑从服务器端代码移植到数据库中的存储过程和函数中。

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

<小时/>

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

使用此 SQL,我连续两次调用 LegacyUpdateProduct 来展示我的问题。

SQL

存储过程接受一些带有数据的参数,不返回结果集,并且 out 给出带有行 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 或 MySQL Workbench 中复制并粘贴据称有错误的 SQL 时,它运行顺利,没有错误或警告。

实际上,我能够在单个查询中连续调用 LegacyUpdateProduct 多达 50 次,在 PHPMyAdmin 和 MySQL Workbench 中都没有出现问题。

我已经通过 Google 和 SO 寻找可能在某种程度上相关或有帮助的问题,但没有发现太多可以继续的内容,除了这可能是某种 Code Igniter 错误,但即使使用普通的 PHP我也发现了同样的问题。

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

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

帮忙?

最佳答案

In PHP anyone would expect to simply run the query with the 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() 调用没有明显减少。

关于php - 在单个语句中多次调用存储过程时出现错误 1064,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39188189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com