mysql - 迭代 MySQL 模式

标签 mysql stored-procedures

问题描述

我有一个单租户 MySQL 数据库设置。也就是说,我为每个客户端都有一个相同的架构。

现在我需要为每个客户端运行特定的查询。这在 Multi-Tenancy 设置(所有客户端共享一个模式)中很容易。然而,根据我的设置,我需要迭代模式。 更一般地说,我想访问一个名称由变量指定的模式。如何做到这一点?

我尝试过的

  • 如果我尝试USE varSchemaName(其中varSchemaName是一个varchar 变量),我收到错误消息ERROR 1314: USE is not allowed 在存储过程中

  • 如果我尝试SELECT * FROM varSchemaName.MyTable我得到 错误代码:1146。表“varSchemaName.MyTable”不存在。显然 MySQL 认为 varSchemaName 是一个文字,而不是一个 变量。

最佳答案

基于 fancyPants 的答案,您可以在另一个过程的循环中调用该过程,该过程查询 information_schema.tables 以识别包含 MyTable 的数据库,然后使用数据库名称作为参数调用 fancyPants 的过程。如果数据库具有一致的命名方案或包含相同命名的对象(听起来就像这里的情况),则此方法很容易。结构类似于:

DELIMITER //

DROP PROCEDURE IF EXISTS mydriver //
CREATE PROCEDURE mydriver()
BEGIN

  DECLARE varSchemaName VARCHAR(64);
  DECLARE done BOOLEAN;
  DECLARE cur CURSOR FOR
    SELECT table_schema
    FROM information_schema.tables
    WHERE table_name = 'MyTable';

  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN cur;
    read_loop: LOOP
      FETCH cur INTO varSchemaName;
      IF done THEN
        LEAVE read_loop;
        CLOSE cur;
      END IF;

      CALL fancypants_proc(varSchemaName);

    END LOOP;
END //

DROP PROCEDURE IF EXISTS fancypants_proc //
CREATE PROCEDURE fancypants_proc(IN varSchemaName VARCHAR(64))
BEGIN

  SET @sql = CONCAT('SELECT * FROM ', varSchemaName, '.MyTable');
  PREPARE stmt FROM @sql;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;

END //

DELIMITER ;

CALL mydriver();

关于mysql - 迭代 MySQL 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13817968/

相关文章:

mysql - 如何从生日日期开始按年龄对 MySQL 结果进行排序

php - 以整数形式返回 result_array() 元素之一

debugging - 是否可以通过调试器检查表值参数的内容?

java - 在 Hibernate 3 中使用存储过程

MySQL 事件错误 1064

mysql - sql - 连接 2 个表 10 次

mysql - 事件记录: Getting a User's Username with a user Id

php - 何时使用 View 以及何时使用存储过程

php - PHP 预准备语句调用的存储过程内部的预准备语句

c# - Mysql存储过程错误1418