为啥存储过程没有在一个字符串中给出输出并且在 MySql 6.0 上执行的存储过程在 MySql 5.0 上给出错误

Posted

技术标签:

【中文标题】为啥存储过程没有在一个字符串中给出输出并且在 MySql 6.0 上执行的存储过程在 MySql 5.0 上给出错误【英文标题】:Why stored procedure is not giving output in one string and the stored procedure executed on MySql 6.0 gives error on MySql 5.0为什么存储过程没有在一个字符串中给出输出并且在 MySql 6.0 上执行的存储过程在 MySql 5.0 上给出错误 【发布时间】:2012-10-15 11:51:58 【问题描述】:

我有以下表结构

id     |      Name     | senior id

1      |   superadmin  |  -1
2      |   abc         |   1     
3      |   xyz         |   1
4      |   pqr         |   2   
5      |   vwx         |   3
6      |   stu         |   3
7      |   efg         |   4
8      |   ijk         |   3
9      |   nop         |   3
10     |   rst         |   3
11     |   uvw         |   9

这里我写了一个存储过程,它以 id 作为输入,将返回一个由 '/' 分隔的串联名称字符串,从与 id 关联的名称到其高级 ID 为 -1 的名称。

例如,如果我将 id 作为 10 传递给 SP,我将期望返回字符串为 rst/xyz/superadmin/

这是我写的存储过程

DELIMITER $$;

DROP PROCEDURE IF EXISTS `mydb`.`get_list_up_to_senior`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `get_list_up_to_senior`(id int (8))

BEGIN
DECLARE strsenior VARCHAR(250);
DECLARE strseniorlist VARCHAR(250);
DECLARE temp int(8);
SET strsenior =  '';
SET strseniorlist = '';
SET temp = id;
WHILE temp  != -1 DO
   SET  strsenior = (SELECT name FROM mydb.tblname WHERE id = temp limit 1);
   SET  temp = (SELECT seniorid FROM mydb.tblname WHERE id = temp limit 1);
   SET  strseniorlist = CONCAT(strseniorlist,strsenior,'/');
END WHILE;

SELECT strseniorlist;
END$$

DELIMITER ;$$

当我编译这个 SP 时,我得到编译没有错误。但是当我执行这个 SP 时;它得到完美执行并返回

strseniorlist
superadmin/

1)我的 SP 出了什么问题,导致我没有得到想要的输出。

我的数据库版本是 mysql 6.0,我使用 Sqlyog 在 SP 以上执行。

2)当我在 MySql 5.0 上执行上述 SP 时,它没有被创建并给出以下错误

ERROR :

(0 row(s) affected)
(0 ms taken)

Error Code : 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'PROCEDURE `get_list_up_to_senior`(id int (8))

BEGIN
DECLARE strsenior VA' at line 1
(16 ms taken)

请朋友们指导我解决问题 谢谢!

【问题讨论】:

MySQL的最新版本是5.6。请仔细检查您的软件版本并编辑您的问题。 @OllieJones 谢谢先生的回复,我确定 MySql 软件版本是 6.0.11。我已经从这个 URL downloads.mysql.com/archives.php?p=mysql-6.0 下载了它我已经下载了 Microsoft Windows 的安装程序。 【参考方案1】:

我找到了第一个问题的原因和答案。 未获得预期输出的原因是我使用用户定义变量名“id”作为 SP 的传入参数。这个变量名“id”类似于我提到的表的列名。所以 MySql 将这个 'id' 视为局部变量而不是表列。冲突就在这里。如果您将传入参数变量名称更改为 SP 到其他不会与查询中提到的表中的列名冲突的名称。您将获得所需的输出。

谢谢!

【讨论】:

以上是关于为啥存储过程没有在一个字符串中给出输出并且在 MySql 6.0 上执行的存储过程在 MySql 5.0 上给出错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个选择排序代码在 Cpp 中,没有给出所需的输出

My SQL 动态查询执行并将输出输出到存储过程中的变量中

为啥这个链表程序没有给出任何输出?

oracle数据库的存储过程中可以用到隐形游标。但是我不太明白为啥可以用 for in loop来完成对数据的处理。

为啥 Django ORM explain() 函数没有给出预期的输出?

为啥 nameof() 在 Linq 表达式中给出一个模棱两可的调用警告,但当我使用与字符串相同的值时却没有?