mysql - 在 SELECT 语句中使用变量引用另一个数据库

标签 mysql variables stored-procedures

我正在尝试循环遍历保存另一个数据库的数据库名称的表中的所有行。这就是我所拥有的,它可以编译,但不能工作,因为 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/

相关文章:

MATLAB 不显示正确的计算

linux - 编写一个 bash 脚本,将 debian 最小安装转换为 crunchbang 安装,但由于某种原因它不起作用

javascript - Ajax 调用一直给我 "internal server error 500"

Mysql存储过程在某些行后停止迭代

c# - 从 Entity Framework 返回自定义对象 <List T> 并分配给对象数据源

连接本地MySQL数据库的Python 3.2脚本

mysql - 有没有办法覆盖 @FetchProfile 中的 @LazyCollection(LazyCollectionOption.FALSE) 设置

mysql - 复制数据库字段

MySQL SHA1 哈希不匹配

variables - 如何为故事书注入(inject)环境变量