表名作为参数传给函数,提示不能用动态sql语句

MySql 码拜 9年前 (2015-09-18) 1474次浏览
 

以下语句在函数当中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楼:

表名作为参数传给函数,提示不能用动态sql语句
#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
#10

40分

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楼:

我复制你的两段代码,都提示语法错误。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明表名作为参数传给函数,提示不能用动态sql语句
喜欢 (0)
[1034331897@qq.com]
分享 (0)