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

Posted

技术标签:

【中文标题】MySQL:数据库名称作为视图中的参数【英文标题】:MySQL: Database name as parameter in view 【发布时间】:2016-01-07 12:05:55 【问题描述】:

创建视图时遇到问题:

在这个视图中,我从选定的数据库中选择数据并将其与另一个数据库中的数据连接 - 这部分工作得很好。

这是起作用的部分:

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

【问题讨论】:

你指的和这个question一样吗 或者this 一个? 不是真的,但感谢您查找它。首先,该问题指的是 MS SQL,其次它已经可以在一个视图中查询不同的数据库。只有我想从视图外部更改其中一个数据库。 我仍然不确定您在问什么,但也许dba 的数据库专家可以帮助您。 我编辑了我的问题,也许不是很清楚,我在尝试什么。 【参考方案1】:

您可能需要查看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' );

【讨论】:

以上是关于MySQL:数据库名称作为视图中的参数的主要内容,如果未能解决你的问题,请参考以下文章

Mysql中高级操作中的视图_事务_索引_账户权限管理

MySQL——视图

MySQL数据库高级——视图

mysql数据库视图

mysql内置功能—视图

数据库:mysql内置功能-视图