为啥存储过程没有在一个字符串中给出输出并且在 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 上给出错误的主要内容,如果未能解决你的问题,请参考以下文章
oracle数据库的存储过程中可以用到隐形游标。但是我不太明白为啥可以用 for in loop来完成对数据的处理。