gpt4 book ai didi

MySQL 动态设置数据库名称并选择 db.schematable

转载 作者:搜寻专家 更新时间:2023-10-30 20:38:39 26 4
gpt4 key购买 nike

我正在创建一个存储过程,它需要一些输入参数。我希望能够选择要使用的数据库,然后根据如下所示的条件,我希望使用正确的 where 条件。

我知道您不能在存储过程中使用"USE" 关键字,我也尝试在查询中设置@ds,但收效甚微。

我正在使用 Navicat 并在 IDE 中定义了我的参数,我的输入参数是:

  • icustomername varchar(255)
  • 邮政编码 varchar(255)
  • iaccountnumber varchar(255)
  • 成员数据库名称 varchar(255)

SQL

BEGIN
declare dbName varchar(255); --attempt at using db name passed in
select imemberdbname into dbName;
set @ds = concat(dbName,'.customers'); -- I have also tried this

if LENGTH(icustomername) > 0 THEN
(Select customerid, customername, postcode, accountnumber from dbName.customers
WHERE customername = icustomername);
ELSEIF len(ipostcode) > 0 THEN
(Select customerid, customername, postcode, accountnumber from dbName.customers
WHERE postcode = ipostcode);
ELSE
(Select customerid, customername, postcode, accountnumber from dbName.customers
WHERE accountnumber = iaccountnumber);
end if;

END

我无法选择 db.table 以执行选择。这有可能吗?还是有更好的解决方案?

最佳答案

您可以使用 prepared statement 来做到这一点.

一个非常基本的准备语句看起来像这样:

SET @stat = CONCAT('SELECT * FROM ', @tab'); 

PREPARE stmt FROM @stat;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

编辑:最基本语句的完整示例,使用 if 语句为“where”和“table”子句设置变量,您应该没问题!

EDIT2:认为您不想使用传入参数、编辑查询的语句。

EDIT3:基本上完成了存储过程,您可以使用CALL test('dbname.tablename')调用该过程,您在此处提供的参数是表名/dbname.tablename。

CREATE DEFINER=`user`@`%` PROCEDURE `test`(IN tbl VARCHAR(255))
BEGIN
DECLARE cols VARCHAR(255);
DECLARE conditions VARCHAR(255);

SET cols = 'customerid, customername, postcode, accountnumber';


IF LENGTH(icustomername) > 0 THEN
SET conditions = CONCAT("customername = '", icustomername, "'");

ELSEIF len(ipostcode) > 0 THEN
SET conditions = CONCAT("postcode = '", ipostcode, "'");

ELSE SET conditions = CONCAT("accountnumber = '", iaccountnumber , "'");
END IF;

SET @stat = CONCAT('SELECT ', cols, ' FROM ', tbl, ' WHERE ', conditions );
PREPARE stmt from @stat;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END

-------
CALL test('tablename');

关于MySQL 动态设置数据库名称并选择 db.schematable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30122360/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com