mariadb 程序 phpmyadmin 错误
Posted
技术标签:
【中文标题】mariadb 程序 phpmyadmin 错误【英文标题】:mariadb procedure phpmyadmin error 【发布时间】:2017-03-30 08:54:52 【问题描述】:在 phpmyadmin sql 框中创建存储过程时出现以下错误:
1064 - 您的 SQL 语法有错误;检查手册 对应于您的 MariaDB 服务器版本,以便使用正确的语法 在第 1 行的 ') BEGIN DECLARE ref_id varchar(10)' 附近
CREATE PROCEDURE get_tree(IN id varchar)
BEGIN
DECLARE ref_id varchar(10);
DECLARE userid varchar(10);
SET userid = id;
SET ref_id='';
SELECT ref_id into ref_id
FROM user WHERE user_id=id ;
create TEMPORARY table IF NOT EXISTS temp_table as (select * from user where 1='');
truncate table temp_table;
WHILE ref_id <> '' DO
insert into temp_table select * from user WHERE user_id=userid;
SET userid = ref_id;
SET ref_id='';
SELECT ref_id into ref_id
FROM user WHERE user_id=userid;
END WHILE;
select * from temp_table;
END
【问题讨论】:
【参考方案1】:问题在于过程参数——没有长度就不能有 varchar。应该是
CREATE PROCEDURE get_tree(IN id varchar(10))
BEGIN
...
(或任何你想要的长度,但 10 似乎是一个合理的选择)。
【讨论】:
【参考方案2】:通过添加以下分隔符解决问题:
DELIMITER $$
CREATE PROCEDURE get_tree(IN id varchar(10))
BEGIN
DECLARE ref_id varchar(10);
DECLARE userid varchar(10);
SET userid = id;
SET ref_id='';
SELECT ref_id into ref_id
FROM user WHERE user_id=id ;
create TEMPORARY table IF NOT EXISTS temp_table as (select * from user where 1='');
truncate table temp_table;
WHILE ref_id <> '' DO
insert into temp_table select * from user WHERE user_id=userid;
SET userid = ref_id;
SET ref_id='';
SELECT ref_id into ref_id
FROM user WHERE user_id=userid;
END WHILE;
select * from temp_table;
END$$
DELIMITER ;
【讨论】:
一个注释只是为了防止未来的读者感到困惑。更改分隔符无论如何都不会解决甚至影响问题中描述的 initial 问题;有或没有它,你仍然会在第 1 行得到相同的错误。只有在你实际修复了错误的参数之后(正如在这个答案中所做的那样),分隔符才会变得重要,如果它没有更改为非-分号在你的会话前面,它自然会导致一个语法错误,但一个完全不同的,在第 3 行,第一个分号出现。以上是关于mariadb 程序 phpmyadmin 错误的主要内容,如果未能解决你的问题,请参考以下文章
MySQL - 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册以获取正确的语法 - phpMyAdmin
为啥 MariaDB - 或 phpMyAdmin - 拒绝我为临时表创建 TABLE 语法?
“非法混合排序规则”错误与 phpMyAdmin 的库存安装