MySQL:数据库名称作为视图中的参数

时间:2016-01-07 12:05:56

标签: mysql database view mariadb

创建视图时遇到问题:

在此视图中,我从所选数据库中选择数据,并将其与来自另一个数据库的数据连接起来 - 这部分工作正常。

这是可行的部分:

SELECT tDb1.column1, tDb1.column2, tDb2.columnFromDb2
FROM tableFromDbInUse tDb1
JOIN db2.tableFromDb2 tDb2 ON tDb1.something = tDb2.something

我正在寻找一种方法来交换第二个数据库,而无需更改视图中的语句。像“db2”一样,它将充当存储过程@ db2中的参数。 @ db2将是数据库名称的别名,然后我可以在其他地方设置。通过这种方式,我可以在具有不同名称但结构相同的数据库中使用视图,而无需手动修改所有语句。

有没有办法做到这一点?

这是伪代码,它将显示我试图实现的目标。我使用@ db2作为我正在寻找的“参数”行为:

SELECT tDb1.column1, tDb1.column2, tDb2.columnFromDb2
FROM tableFromDbInUse tDb1
JOIN @db2.tableFromDb2 tDb2 ON tDb1.something = tDb2.something

1 个答案:

答案 0 :(得分:0)

您可能需要检查Prepared Statements

这可能是适合您情况的最佳解决方案。

已编辑

您将避免添加额外的代码,而可能需要在所有语句中进行额外的调整。

存储过程可以解决问题,即

DELIMITER //
DROP PROCEDURE IF EXISTS `proc_switch` //
CREATE PROCEDURE `proc_switch`( IN `INquery` LONGTEXT, IN `INdb` VARCHAR(64) )
`bgn_lbl`:BEGIN
    PREPARE `stmt` FROM `INquery`;
    EXECUTE `stmt` USING `INdb`;
    DEALLOCATE PREPARE `stmt`;
END // 

DELIMITER ;

通过电话获取结果,即

CALL `proc_switch`( "SELECT tDb1.column1, tDb1.column2, tDb2.columnFromDb2 FROM tableFromDbInUse tDb1 JOIN ?.tableFromDb2 tDb2 ON tDb1.something = tDb2.something", 'db1' );