创建视图时遇到问题:
在此视图中,我从所选数据库中选择数据,并将其与来自另一个数据库的数据连接起来 - 这部分工作正常。
这是可行的部分:
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
答案 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' );