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解决办法
使用带有 --ssl 的 PHP PDO 连接到 MySQL/MariaDB,无需证书