搜索

首页  >  问答  >  正文

使用机器人框架执行包含 SQL 脚本的存储过程

<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>
P粉031492081P粉031492081455 天前501

全部回复(1)我来回复

  • P粉268284930

    P粉2682849302023-08-29 11:03:12

    DELIMITER是仅支持客户端的语句,服务器不支持它,因此出现错误。解决方案-删除它。

    这里有一个带有非常好答案的问题,解释了DELIMITER是什么以及为什么需要。

    简而言之-当你与客户端一起工作时,你需要一种方法来指示它“这不是立即执行的语句,这仍然只是你将发送给服务器的存储过程中的一行”-所以你告诉(客户端)“语句之间的DELIMITER暂时是$$”。服务器不需要/关心这个-它知道CREATE PROCEDURE, BEGIN, END之间的所有内容都是连接的语句,一个块。

    当你通过API(pymysql)连接到数据库时,与交互式客户端(shell,heidisql等)相比-你将SP作为一个块发送,没有办法逐个运行它的语句,因此DELIMITER是不需要的,服务器不支持该命令,并且会生成错误。删除它。

    回复
    0
  • 取消回复