2012-10-04 20 views
7

Ich möchte Daten aus jeder Tabelle ausgeben, die eine first_name Spalte enthält. Ich stelle die folgende Prozedur zusammen, aber in meiner Schleife interpretiert mysql den Tabellennamen wörtlich, anstatt die Variable table_name auszuwerten. Was ist das Problem?MySQL-Schleife durch Tabellen

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(); 

Antwort

9

Try this verwenden:

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

Ich habe ein ähnliches Problem. Wenn ich den Tabellennamen nicht nach 'LIKE '% first%' filtern möchte, kann ich' SHOW TABLES' anstelle von 'SELECT TABLE_NAME ...' verwenden? – Kal

+1

Tabellenname ist ein reservierter Name. sollte zu einem anderen Namen geändert werden. –

-1

in cur1 Sie TABLE_NAME dort versuchen, einen echten Namen der Tabelle mit

+1

Aber die Tabelle ist nicht bekannt, er bekommt Tabellennamen von INFORMATION_SCHEMA. – Barmar

0

eine wenig Bearbeitung des vor allem um die Tabellen zu itertate ahtoug und wählt Sie Sie.

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

Tabellenname ist ein reserviertes Token Verwenden Sie einen anderen Variablennamen in "DECLARE table_name CHAR (255);"

Verwandte Themen