MariaDB/MySQL 中的 CREATE PROCEDURE 出现神秘错误

Posted

技术标签:

【中文标题】MariaDB/MySQL 中的 CREATE PROCEDURE 出现神秘错误【英文标题】:Mysterious error in CREATE PROCEDURE in MariaDB/MySQL 【发布时间】:2018-04-14 05:59:30 【问题描述】:

我尝试在 MariaDB 10.2 中创建一个简单的过程,但遇到了关于变量定义的问题。

我收到 (conn:107) 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,了解在我声明变量时在第 3 行消息附近使用的正确语法。

我阅读了 MariaDB 文档,它说一个变量是这样定义的 DECLARE var_name [, var_name] ... type [DEFAULT value]

我哪里错了?我来自 Oracle SQL,并且为我连接了一些 sintax。

我使用 Eclipse 和 MariaDB JDBC 来连接 SQL。

CREATE PROCEDURE nom_jobs_insert(IN p_name varchar(100) CHARACTER SET 'utf8')
BEGIN
    DECLARE counter INT DEFAULT 0;

    SELECT count(*) INTO counter
    FROM nom_jobs
    WHERE lower(name) = lower(p_name)

    IF counter = 1 THEN
        INSERT INTO nom_jobs(name) VALUES (p_name);
    END IF;
END;

【问题讨论】:

我无法重现该问题,请参阅dbfiddle。 【参考方案1】:

我找到了解决办法。

在 MariaDB 中,您必须在创建过程之前定义一个 分隔符,并且您需要标记过程代码的完成位置。

DELIMITER //
CREATE PROCEDURE nom_jobs_insert(IN p_name varchar(100) CHARACTER SET 'utf8')
BEGIN
    DECLARE counter INT DEFAULT 0;

    SELECT count(*) INTO counter
    FROM nom_jobs
    WHERE lower(name) = lower(p_name);

    IF counter = 1 THEN
        INSERT INTO nom_jobs(name) VALUES (p_name);
    END IF;
END; //

【讨论】:

【参考方案2】:

您的错误不在DECLARE 表达式中,请在SELECT 语句后添加;

【讨论】:

它不起作用。我在 mysql Workbench 中尝试过,它在声明语句的“0”处告诉我它缺少分号,即使它是“0”之后的分号...【参考方案3】:

以下是指向失踪DELIMITER的线索:

near '' at line 3 第 3 行包含第一个 ; 当错误显示为near '' 时,解析器认为它已超出“语句”的末尾。

把它们放在一起——它认为有一个以; 结尾的三行语句。但是CREATE PROCEDURE 应该比这更长。

【讨论】:

【参考方案4】:
CREATE PROCEDURE nom_jobs_insert(IN p_name varchar(100) CHARACTER SET 'utf8')
IS
DECLARE counter INTEGER DEFAULT 0;
BEGIN
    

    SELECT count(*) INTO counter
    FROM nom_jobs
    WHERE lower(name) = lower(p_name)

    IF counter = 1 THEN
        INSERT INTO nom_jobs(name) VALUES (p_name);
    END IF;
END;

【讨论】:

它显示另一个错误:“...检查与您的 MariaDB 服务器版本相对应的手册,以了解在 'IS' 附近使用的正确语法”。

以上是关于MariaDB/MySQL 中的 CREATE PROCEDURE 出现神秘错误的主要内容,如果未能解决你的问题,请参考以下文章

mariadb mysql -u root -p 显示Access denied解决办法

MYSQLDDL语句

使用带有 --ssl 的 PHP PDO 连接到 MySQL/MariaDB,无需证书

MariaDB/MySQL中的变量

MariaDB/MySQL 使用更新内部加入 MariaDB 是错误的顺序,但在 MySQL 中是正确的

Docker MariaDB/Mysql 转储