【问题标题】:mariadb procedure phpmyadmin errormariadb 程序 phpmyadmin 错误
【发布时间】: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

【问题讨论】:

    标签: stored-procedures phpmyadmin mariadb


    【解决方案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 行,第一个分号出现。
      猜你喜欢
      • 1970-01-01
      • 2016-04-08
      • 2013-12-22
      • 2021-06-22
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 2014-03-30
      • 2011-07-04
      相关资源
      最近更新 更多