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 错误的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu MariaDB PhpMyAdmin

MySQL - 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册以获取正确的语法 - phpMyAdmin

为啥 MariaDB - 或 phpMyAdmin - 拒绝我为临时表创建 TABLE 语法?

“非法混合排序规则”错误与 phpMyAdmin 的库存安装

列未显示在 PHP 查询中,但显示在 MariaDB 的 phpmyadmin 界面中

无法使用 MariaDb docker-compose 获取 PhpMyAdmin