使用机器人框架执行包含 SQL 脚本的存储过程
P粉031492081
2023-08-28 22:08:52
<p>我想运行包含数据库和表创建以及存储过程创建的sql脚本。
但是当我尝试使用<strong>execute sql script</strong>关键字在<strong>database library</strong>中运行sql脚本时,我会得到以下错误:</p>
<pre class="brush:php;toolbar:false;">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")</pre>
<p>在存储过程之前,我有这样的<strong>delimiter</strong>:</p>
<pre class="brush:php;toolbar:false;">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 ;</pre>
<p>如果我注释掉存储过程部分,sql文件将在其余的表创建语句中运行而不会出错。</p>
<p>我在谷歌上搜索了一下,没有找到相关的问题。我看到我们有调用存储过程的关键字。但是我想把表创建和存储过程放在同一个sql文件中并运行。我在这个任务中使用的是MariaDB。</p>
<p><strong>使用的库</strong>:</p>
<ul>
<li>pymysql</li>
<li>机器人框架数据库库</li>
</ul>
<p>如果我使用HeidiSQL运行sql文件,它将在存储过程和分隔符中运行而不会出现任何错误。这意味着没有sql错误。</p>
<p><strong>有人能告诉我如何解决这个问题吗?</strong></p>
DELIMITER是仅支持客户端的语句,服务器不支持它,因此出现错误。解决方案-删除它。
这里有一个带有非常好答案的问题,解释了DELIMITER是什么以及为什么需要。
简而言之-当你与客户端一起工作时,你需要一种方法来指示它“这不是立即执行的语句,这仍然只是你将发送给服务器的存储过程中的一行”-所以你告诉(客户端)“语句之间的DELIMITER暂时是$$”。服务器不需要/关心这个-它知道
CREATE PROCEDURE, BEGIN, END
之间的所有内容都是连接的语句,一个块。当你通过API(pymysql)连接到数据库时,与交互式客户端(shell,heidisql等)相比-你将SP作为一个块发送,没有办法逐个运行它的语句,因此DELIMITER是不需要的,服务器不支持该命令,并且会生成错误。删除它。