如何对视图使用存储过程进行动态查询?

Posted

技术标签:

【中文标题】如何对视图使用存储过程进行动态查询?【英文标题】:How to make dinamic query for view use stored procedure? 【发布时间】:2019-12-19 03:20:44 【问题描述】:

你愿意帮我创建一个这样的存储过程吗?

我有这样的查询:

select * from db_2014.tablename
union
select * from db_2015.tablename
union
select * from db_2016.tablename

但是数据库名称(年份名称)应该从一个表中获取,该表已经存储了“年份”字段。 数据库名称为“年份”的表:

select Year from db_Years.tablename;

我被我的存储过程困住了:

BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
     ROLLBACK;
    END;

    SET @isunion = " union ";
    SET @queryGetYears = "select Year from db_name.tablename group by Year order by Year asc";

    /*LOOPING RESULT OF @queryGetYears*/
    SET @queryFetchDBByYear = CONCAT("select * from db_","-getFieldYear-",".tablename",@isunion);
    /*END LOOPING*/

    /*END SHOWING THE RESULT OF @queryFetchDBByYear*/

  PREPARE stmt from @queryGetYears;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

END

是否可以使用存储过程来实现这一点? 感谢您的关注。

注意:使用 Navicat 构建存储过程

【问题讨论】:

【参考方案1】:

您可以使用下面的代码来获取联合查询。

begin

select group_concat(concat('select * from db_',yr,'.tablename') separator '\nunion all\n') into @unionqry
from (select `Year` as yr from db_name.tablename group by `Year`) t;

prepare stmt from @unionqry;
execute stmt;
deallocate prepare stmt;

end

【讨论】:

以上是关于如何对视图使用存储过程进行动态查询?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL第43天------视图SQL注入问题事务存储过程

06 数据库入门学习-视图sql注入事务存储过程

对视图修改删除增加属性的sql语句是啥

如何在存储过程中使用动态表名编写 Select 查询?

动态透视查询查看/存储过程?

视图、游标是啥?