首页 > 解决方案 > 如何在 Mysql 中使用准备语句来使用数据库

问题描述

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 ',@db,'.ActiveModelUnits_blue) ';
PREPARE s3 from @query;
EXECUTE s3;

标签: mysqlprepared-statement

解决方案


恐怕由于您不能USE作为准备好的语句运行,因此您的选择是有限的。

USE在你调用这个例程之前

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

USE v6_schema;
CALL MyProcedure();

USE里面一个CASE

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

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;

这意味着您仅限于已编码的模式的有限列表。如果不更新代码,您将无法使其适应您将来想到的任何未来模式名称。

使用限定的表名

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


推荐阅读