gpt4 book ai didi

php - 如何使用 PDO 在 PHP 中创建包含 DELIMITER 的存储过程?

转载 作者:行者123 更新时间:2023-11-29 15:59:57 32 4
gpt4 key购买 nike

在我的模型中,我定义了一些过程。代码(由 MySQL Workbench 生成)包含 DELIMITER 定义,因此过程如下所示:

-- schema
CREATE DATABASE ...
CREATE TABLE foo ...
-- procedures
DELIMITER $$
...
BEGIN
DECLARE ... ;
OPEN ... ;
SET ... ;
... ;
END$$
DELIMITER ;

现在我需要通过PDO将SQL“导入”到数据库。我尝试将其作为 PDO#exec(...) 的输入传递,但请注意,执行在第一个 DELIMITER 定义行处停止。

我不想删除 DELIMITER 语句。因此 SQL 代码应该保持不变。

如何使用PDO执行包含DELIMITER语句的SQL代码?

最佳答案

来自评论:

I don't want remove the DELIMITER statements. And actually I want to get it working without to execute every statement manually

事情不是这样的。

要理解原因,您需要了解mysql CLI以及任何其他可以读取和执行这样的转储文件的程序实际上是如何处理它的。

DELIMITER 不是服务器能够理解的内容。

DELIMITER 用于告诉客户端解析器当前语句分隔符应该是什么,以便客户端解析器能够正确地拆分语句并传递一个一次到服务器执行。

来自文档。请仔细注意,mysql,每次在这里使用它时,都是指mysql客户端实用程序——而不是服务器。

If you use the mysql client program to define a stored program containing semicolon characters, a problem arises. By default, mysql itself recognizes the semicolon as a statement delimiter, so you must redefine the delimiter temporarily to cause mysql to pass the entire stored program definition to the server.

To redefine the mysql delimiter, use the delimiter command. [...] The delimiter is changed to // to enable the entire definition to be passed to the server as a single statement, and then restored to ; before invoking the procedure. This enables the ; delimiter used in the procedure body to be passed through to the server rather than being interpreted by mysql itself.

https://dev.mysql.com/doc/refman/5.7/en/stored-programs-defining.html

因此,要处理这样的文件,您需要一个客户端解析器来执行与 mysql 相同的操作...在这里,您正在编写的代码(必须是)客户端语句解析器。因此,您需要编写处理分隔符的逻辑。

要执行您想要的操作,您必须解释 DELIMITER 语句,使用它们来跟踪当前语句分隔符,但不要将它们发送到服务器。

然后,您必须一次一行地读取输入,缓冲所读取的内容,直到在行末尾找到指定的分隔符,并将结果语句发送到服务器 -- 从您发送的内容中排除实际的语句分隔符...因此,例如,您不会在过程主体之后发送结束 $$ (除非当前语句分隔符是 ;,您可以发送或不发送 - 服务器不在乎。)然后清空缓冲区并再次开始读取,直到看到另一个分隔符实例(并将语句发送到服务器)或者匹配 DELIMITER 语句并设置代码的当前分隔符变量来匹配它,以便您正确识别下一个语句的结尾。

关于php - 如何使用 PDO 在 PHP 中创建包含 DELIMITER 的存储过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56259155/

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