Mysql中使用数据库的prepare语句

问题描述

set @switch_schema= concat('use ',v6_schema,';');

select @switch_schema; 
PREPARE s3 from @switch_schema;
EXECUTE s3;

Prepare 语句不支持“使用”;有针对这个的解决方法吗? 解决方法如下,但我正在寻找更强大的解决方

set @db := v6_schema;

drop temporary table if exists tempdb.activeUnits;
set @query = concat ('create temporary table tempdb.activeUnits
select *
from ',@db,'.activemodelunits_blue
where active_datetime = (Select max(active_datetime) from ','.ActiveModelUnits_blue) ';
PREPARE s3 from @query;
EXECUTE s3;

解决方法

恐怕您无法将 USE 作为准备好的语句运行,因此您的选择有限。

USE 在调用此例程之前

在调用引用表的过程之前,您可以从应用程序调用 USE

USE v6_schema;
CALL MyProcedure();

USECASE

如果您在存储过程中编写此代码,则可以使用 CASE statement

BEGIN
  CASE v6_schema
  WHEN 'myschema1' THEN USE myschema1;
  WHEN 'myschema2' THEN USE myschema2;
  WHEN 'myschema3' THEN USE myschema3;
  ELSE USE mydefaultschema;
  END CASE;
END;

这意味着您只能使用已编码的有限模式列表。您无法在不更新代码的情况下使其适应您将来想到的任何架构名称。

使用限定的表名

这是您在问题中提到的解决方法。每次在准备好的查询中引用这些表时,将架构名称与表名称连接起来。