我正在尝试循环遍历保存另一个数据库的数据库名称的表中的所有行。这就是我所拥有的,它可以编译,但不能工作,因为 MySQL 将“数据库”位作为实际的数据库名称而不是内容。
如何更改以下内容以使其采用变量的内容?
DROP PROCEDURE IF EXISTS CYCLE;
DELIMITER ;;
CREATE PROCEDURE CYCLE()
BEGIN
DECLARE data_name CHAR(255);
DECLARE done INT DEFAULT FALSE;
DECLARE cursor_i CURSOR FOR SELECT database FROM company;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cursor_i;
read_loop: LOOP
FETCH cursor_i INTO database;
IF done THEN
LEAVE read_loop;
END IF;
SELECT * FROM database.table LIMIT 1;
END LOOP;
CLOSE cursor_i;
END;
;;
DELIMITER ;
更新:需要明确的是,我知道“数据库”是一个保留字。我在这里使用它来代替我使用的实际变量名称。
最佳答案
您无法评估表选择语句上变量的内容,在这种情况下,您必须在字符串中构建查询并执行:
DROP PROCEDURE IF EXISTS CYCLE;
DELIMITER ;;
CREATE PROCEDURE CYCLE()
BEGIN
DECLARE data_name CHAR(255); -- unused?
DECLARE done INT DEFAULT FALSE;
DECLARE cursor_i CURSOR FOR SELECT database_name FROM company;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cursor_i;
read_loop: LOOP
FETCH cursor_i INTO data_name;
IF done THEN
LEAVE read_loop;
END IF;
-- now build the query before execute:
set @sql = concat('SELECT * FROM `',data_name,'`.`your_table` LIMIT 1');
-- and execute
prepare stmt from @sql;
execute stmt;
deallocate prepare stmt ;
END LOOP;
CLOSE cursor_i;
END;
;;
DELIMITER ;
*最好不要使用引起更多问题的变量名称来混淆我们。 #只是说
关于mysql - 在 SELECT 语句中使用变量引用另一个数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45438807/