将表名传入UDF中? 如是,要用字符串累加生成SQL语句,再动态执行的方法 set @asql=concat('select * from ',tablename); prepare stml from @asql; execute stml;
CREATE FUNCTION GetTOID() RETURNS BigInt Unsigned begin select userID into @ID FROM user1 where .......; RETURN @ID; end;------------ 这个函数只能得到 user1 表中的值,还有user2,user3,user4等等,要是每个表都写一个的话太不方便了,最好一个函数都能解决把表名传进去组装是个好办法,但是我不太会在函数里操作数据对象!
CREATE FUNCTION GetTOID(tablename varchar(30)) RETURNS BigInt Unsigned begin set @asql=concat('select userID into @ID FROM ',tablename,' where .......'); prepare stml from @asql; execute stml;
RETURN @ID; end;
那回答就很简单了。 除非你直接去改MYSQL的源代码,否则无解。
呜呜,我那个SQL语句后面很长,还有括弧!执行错误(1336)Dynamic SQL is not allowed in stored function or trigger
还没搞定呀?? 这样一步步来吧、 1:把你的函数带个参数,名称就是表名称 CREATE FUNCTION GetTOID(tablename varchar(30)) RETURNS BigInt Unsigned begin select userID into @ID FROM user1 where .......; RETURN @ID; end; 把这个函数调试成功,保证传进去的表名称能够起作用2:CREATE PROCEDURE Clear_DB( DB_NAME varchar(50) # 数据库名称 ) BEGIN DECLARE done INT DEFAULT 0; #游标的标志位 DECLARE a varchar(20); DECLARE b varchar(20); DECLARE cur1 CURSOR FOR SELECT table_name FROM information_schema.TABLES WHERE table_schema=DB_NAME ; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN cur1; REPEAT FETCH cur1 INTO a; IF NOT done THEN set b=concat('select GetTOID( ',a,')'); # 拼命令 SET @E=b; PREPARE stmt1 FROM @E; EXECUTE stmt1; # 执行命令 DEALLOCATE PREPARE stmt1; #释放对象 END IF; UNTIL done END REPEAT; CLOSE cur1; END;创建这个存储过程,对每个表都执行这个函数。
如果你的意思是想在 myfunction 中得到table1的表名,则没有办法。
这些系统函数根本不需要知道是哪些表。比如 select sum(col) from table1
数据库会执行 select col from table1然后对每条符合条件的记录的COL列进行累加。
应该是系统解析SQL语句并运行,不用人工干预
如是,要用字符串累加生成SQL语句,再动态执行的方法
set @asql=concat('select * from ',tablename);
prepare stml from @asql;
execute stml;
CREATE FUNCTION GetTOID() RETURNS BigInt Unsigned
begin
select userID into @ID FROM user1 where .......;
RETURN @ID;
end;------------
这个函数只能得到 user1 表中的值,还有user2,user3,user4等等,要是每个表都写一个的话太不方便了,最好一个函数都能解决把表名传进去组装是个好办法,但是我不太会在函数里操作数据对象!
begin
set @asql=concat('select userID into @ID FROM ',tablename,' where .......');
prepare stml from @asql;
execute stml;
RETURN @ID;
end;
那回答就很简单了。
除非你直接去改MYSQL的源代码,否则无解。
呜呜,我那个SQL语句后面很长,还有括弧!执行错误(1336)Dynamic SQL is not allowed in stored function or trigger
里面包含取出某个库的全部表,然后对这些表进行操作。你的问题貌似可以通过这个办法解决。
这样一步步来吧、
1:把你的函数带个参数,名称就是表名称
CREATE FUNCTION GetTOID(tablename varchar(30)) RETURNS BigInt Unsigned
begin
select userID into @ID FROM user1 where .......;
RETURN @ID;
end;
把这个函数调试成功,保证传进去的表名称能够起作用2:CREATE PROCEDURE Clear_DB(
DB_NAME varchar(50) # 数据库名称
)
BEGIN
DECLARE done INT DEFAULT 0; #游标的标志位
DECLARE a varchar(20);
DECLARE b varchar(20);
DECLARE cur1 CURSOR FOR SELECT table_name FROM information_schema.TABLES WHERE table_schema=DB_NAME ;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN cur1;
REPEAT
FETCH cur1 INTO a;
IF NOT done THEN
set b=concat('select GetTOID( ',a,')'); # 拼命令
SET @E=b;
PREPARE stmt1 FROM @E;
EXECUTE stmt1; # 执行命令
DEALLOCATE PREPARE stmt1; #释放对象
END IF;
UNTIL done END REPEAT;
CLOSE cur1;
END;创建这个存储过程,对每个表都执行这个函数。