I have this procedure created from I could find on stack overflow. I want to get rows from all tables that have a certain column in them, for a specific value. So:
- get all tables with the column
get all rows from the tables that have column value of x
@DELIMITER $$ CREATE PROCEDURE db.selectStuff () BEGIN DECLARE a varchar(100); DECLARE i CURSOR FOR SELECT DISTINCT TABLE_NAME from INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME="my_column_name"; OPEN i; read_loop: LOOP FETCH i INTO crt_table; SELECT * FROM crt_table WHERE my_column_name=some_id; END LOOP read_loop; CLOSE i; END$$ @DELIMITER; call selectStuff();
I am getting this
[Code: 1064, SQL State: 42000] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE i CURSOR FOR SELECT DISTINCT TABLE_NAME from INFORMATION_SCHEMA.COLUMNS ' at line 1
when running this from DBVisualizer Pro 9.5.7
The select works.
UPDATE: FROM the comments bellow I changed the code to:
@DELIMITER $$
CREATE PROCEDURE selectStuff ()
BEGIN
DECLARE s VARCHAR(300);
DECLARE i CURSOR FOR SELECT CONCAT('SELECT * FROM ',c.TABLE_NAME,' where `my_column_name`=1') as s from INFORMATION_SCHEMA.COLUMNS c WHERE c.COLUMN_NAME="my_column_name";
OPEN i;
do_stuff: LOOP
FETCH i INTO s;
PREPARE run FROM s;
EXECUTE run;
DEALLOCATE PREPARE run;
END LOOP do_stuff;
CLOSE i;
END$$
@DELIMITER;
call selectStuff();
I am getting the same error.
NOTE: Running
SELECT CONCAT('SELECT * FROM ',c.TABLE_NAME,' where `my_column_name`=1') as s from INFORMATION_SCHEMA.COLUMNS c WHERE c.COLUMN_NAME="my_column_name"
Does actually provide the correct SQL statements that would get me what I want.
UPDATE: Running it in dbForge Studio Express:
DELIMITER $
CREATE PROCEDURE selectStuff()
BEGIN
DECLARE done TINYINT DEFAULT 0;
DECLARE s VARCHAR (3000);
DECLARE i CURSOR FOR SELECT CONCAT("SELECT * FROM ", c.TABLE_NAME, " where my_column_name=1") as QUERY from INFORMATION_SCHEMA.COLUMNS c WHERE c.COLUMN_NAME="my_column_name";
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN i;
do_stuff: LOOP
FETCH i INTO s;
IF done = 1 THEN LEAVE do_stuff;
END IF;
PREPARE stmt FROM s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP do_stuff;
CLOSE i;
END$
DELIMITER;
#call selectStuff();
I get some other error, but the cursor part passes.
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP do_stuff;