我想运行包含数据库和表创建以及存储过程创建的sql脚本。 但是当我尝试使用execute sql script关键字在database library中运行sql脚本时,我会得到以下错误:
ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DELIMITER $$\n CREATE OR REPLACE PROCEDURE `proc_GetCustomerDetails`(\n I...' at line 2")
在存储过程之前,我有这样的delimiter:
DELIMITER $$ CREATE OR REPLACE PROCEDURE `proc_GetCustomerDetails`( IN CustomerNbr LONGTEXT, IN Lang VARCHAR(5) ) DETERMINISTIC BEGIN IF Lang IS NULL THEN SET lang = "fin"; END IF; SELECT * from dbname.customer; END;$$ DELIMITER ;
如果我注释掉存储过程部分,sql文件将在其余的表创建语句中运行而不会出错。
我在谷歌上搜索了一下,没有找到相关的问题。我看到我们有调用存储过程的关键字。但是我想把表创建和存储过程放在同一个sql文件中并运行。我在这个任务中使用的是MariaDB。
使用的库:
如果我使用HeidiSQL运行sql文件,它将在存储过程和分隔符中运行而不会出现任何错误。这意味着没有sql错误。
有人能告诉我如何解决这个问题吗?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
DELIMITER是仅支持客户端的语句,服务器不支持它,因此出现错误。解决方案-删除它。
这里有一个带有非常好答案的问题,解释了DELIMITER是什么以及为什么需要。
简而言之-当你与客户端一起工作时,你需要一种方法来指示它“这不是立即执行的语句,这仍然只是你将发送给服务器的存储过程中的一行”-所以你告诉(客户端)“语句之间的DELIMITER暂时是$$”。服务器不需要/关心这个-它知道
CREATE PROCEDURE, BEGIN, END之间的所有内容都是连接的语句,一个块。当你通过API(pymysql)连接到数据库时,与交互式客户端(shell,heidisql等)相比-你将SP作为一个块发送,没有办法逐个运行它的语句,因此DELIMITER是不需要的,服务器不支持该命令,并且会生成错误。删除它。