2012-10-04 64 views
7

我想输出每个包含first_name列的表的数据。我将以下过程放在一起,但在我的循环中,mysql逐字地解释表名,而不是评估变量table_name。什么是修复?MySQL循环遍历表

delimiter // 

drop procedure if exists hunt // 
create procedure hunt() 
begin 
    DECLARE done int default false; 
    DECLARE table_name CHAR(255); 

    DECLARE cur1 cursor for SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS 
     WHERE TABLE_SCHEMA = "wholesale_production" and COLUMN_NAME LIKE "%first%" ; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 
    open cur1; 

    myloop: loop 
     fetch cur1 into table_name; 
     if done then 
      leave myloop; 
     end if; 
     select * from `wholesale_production`.table_name where created_at >= '2012-10-01'; 
    end loop; 

    close cur1; 
end // 

delimiter ; 

call hunt(); 

回答

9

试试这个:

delimiter // 

drop procedure if exists hunt // 
create procedure hunt() 
begin 
    DECLARE done int default false; 
    DECLARE table_name CHAR(255); 

    DECLARE cur1 cursor for SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS 
     WHERE TABLE_SCHEMA = "wholesale_production" and COLUMN_NAME LIKE "%first%" ; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 
    open cur1; 

    myloop: loop 
     fetch cur1 into table_name; 
     if done then 
      leave myloop; 
     end if; 
     set @sql = CONCAT('select * from `wholesale_production`.', table_name, ' where created_at >= '2012-10-01'); 
     prepare stmt from @sql; 
     execute stmt; 
     drop prepare stmt; 
    end loop; 

    close cur1; 
end // 

delimiter ; 

call hunt(); 
+1

我有类似的问题。如果我不关心将表名称过滤为LIKE'%first%'',我可以使用'SHOW TABLES'而不是'SELECT TABLE_NAME ...'吗? – Kal

+1

table_name是保留名称。应改为不同的名称。 –

-1

在CUR1您使用TABLE_NAME有尝试使用该表的真实姓名

+1

但是表格不知道,他从INFORMATION_SCHEMA获取表名。 – Barmar

0

上面的一个小编辑到itertate ahtoug所有表和选择他们。

delimiter // 
drop procedure if exists hunt // 
create procedure hunt() 
begin 
    DECLARE done int default false; 
    DECLARE table_name CHAR(255); 

    DECLARE cur1 cursor for SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES 
        WHERE table_schema ='mbu4u'; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 
    open cur1; 
     myloop: loop 
     fetch cur1 into table_name; 
     if done then 
      leave myloop; 
     end if; 
     set @sql = CONCAT('select * from `mbu4u`.',table_name); 
     prepare stmt from @sql; 
     execute stmt; 
     drop prepare stmt; 
    end loop; 

    close cur1; 
end // 

delimiter // 
0

table_name是保留的标记在“DECLARE table_name CHAR(255);”中使用另一个变量名称“