以下语句在函数当中SELECT group_concat(id) INTO sTempChd FROM CONCAT(“”””,tablename,””””) where FIND_IN_SET(pid,sTempChd)>0; 这样写语法不能通过 @asql=concat(“”SELECT group_concat(id) INTO sTempChd FROM “”,tablename,”” where FIND_IN_SET(pid,sTempChd)>0″”); PREPARE STML FROM @ASQL; EXECUTE STML; 这样写说不能用动态sql语句难道只能用存储过程 |
|
#1 |
首先 ,这种写法 SELECT group_concat(id) INTO sTempChd FROM CONCAT(“”””,tablename,””””) where FIND_IN_SET(pid,sTempChd)>0; 肯定是会报错的,表名称是不能使用变量的,列名称也不能用变量
|
#2 |
第二个,是在存储过程中可以用 预处理语句的,也就是动态语句的,函数好像不能用
|
#3 |
PREPARE 语句不可以用于存储过程(5.0以上可以使用),自定义函数!但从 MySQL 5.0.13 开始,它可以被用于存储过程,仍不支持在函数或触发器中使用!
|
#4 |
CREATE DEFINER=`root`@`localhost` FUNCTION `getChildLst`(`rootId` VARCHAR(100)) RETURNS varchar(2000) CHARSET utf8BEGIN DECLARE sTemp VARCHAR(1000); DECLARE sTempChd VARCHAR(1000); SET sTemp = “”$””; SET sTempChd =cast(rootId as CHAR); WHILE sTempChd is not null DO SET sTemp = concat(sTemp,””,””,sTempChd); SELECT group_concat(id) INTO sTempChd FROM hp_node where FIND_IN_SET(pid,sTempChd)>0; END WHILE; RETURN sTemp; END 求改成存储过程其中hp_node 就是tablename,要求是可以变的,也就是要传进来的参数。谢谢。
|
#5 |
各位大侠,求转存储过程。
|
#6 |
我把function 简单的改为 PROCEDURE 结果报语法错误
|
#7 |
贴出 create procedure 语句及错误信息以供分析。
|
#8 |
回复7楼: |
#9 |
CREATE procedure `getChildLst`(`rootId` VARCHAR(100)) RETURNS VARCHAR(2000) CHARSET utf8 BEGIN DECLARE sTemp VARCHAR(1000); DECLARE sTempChd VARCHAR(1000); SET sTemp = ""$""; SET sTempChd =CAST(rootId AS CHAR); WHILE sTempChd IS NOT NULL DO SET sTemp = CONCAT(sTemp,"","",sTempChd); SELECT GROUP_CONCAT(id) INTO sTempChd FROM hp_node WHERE FIND_IN_SET (pid,sTempChd)>0; END WHILE; RETURN sTemp; END |
#1040分 |
CREATE DEFINER = `root`@`localhost` PROCEDURE `getChildLst`(IN `rootId` varchar(100),OUT `sTemp` varchar(1000))BEGIN DECLARE sTempChd CHAR(100); SET sTemp = “”$””; SET sTempChd = CAST(rootId as CHAR); WHILE sTempChd is not null DO SET sTemp = concat(sTemp,””,””,sTempChd); SELECT group_concat(id) INTO sTempChd FROM hp_node where FIND_IN_SET(pid,sTempChd)>0; END WHILE; END;
|
#11 |
call getChildLst(“abc”,@temp);select @temp;
|
#12 |
忽然发现….原题是这个CREATE DEFINER = `root`@`localhost` PROCEDURE `getChildLst0`(IN `tablename` varchar(100)) BEGIN set @asql=concat(“”SELECT group_concat(id) INTO sTempChd FROM “”,tablename,”” where FIND_IN_SET(pid,sTempChd)>0″”); PREPARE STML FROM @ASQL; EXECUTE STML; END;
|
#13 |
回复12楼:
我复制你的两段代码,都提示语法错误。
|