MySQL动态设置数据库名称并选择db.schematable
我正在创建一个存储过程,它接受许多输入参数。我希望能够选择使用哪个数据库,然后根据如下所示的条件,我希望使用正确的where条件 我知道您不能在存储过程中使用“use”关键字,我也尝试在查询中设置@ds,但没有太大成功 我正在使用Navicat并在IDE中定义了我的参数,我的输入参数是:MySQL动态设置数据库名称并选择db.schematable,mysql,database,syntax,Mysql,Database,Syntax,我正在创建一个存储过程,它接受许多输入参数。我希望能够选择使用哪个数据库,然后根据如下所示的条件,我希望使用正确的where条件 我知道您不能在存储过程中使用“use”关键字,我也尝试在查询中设置@ds,但没有太大成功 我正在使用Navicat并在IDE中定义了我的参数,我的输入参数是: ICCustomerName varchar(255) ipostcode varchar(255) iaccountnumber varchar(255) imemberdbname varchar(255
- ICCustomerName varchar(255)
- ipostcode varchar(255)
- iaccountnumber varchar(255)
- imemberdbname varchar(255)
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以执行选择。这有可能吗?或者有更好的解决方案吗?您可以使用一个
一个非常基本的准备语句如下所示:
SET @stat = CONCAT('SELECT * FROM ', @tab');
PREPARE stmt FROM @stat;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
EDIT:最基本语句的完整示例,使用if语句为'where'和'table'子句设置变量,应该没问题
EDIT2:我想您不想使用使用传入参数的语句,已编辑的查询
EDIT3:基本上完成了存储过程,您可以使用calltest('dbname.tablename')
调用该过程,这里提供的参数是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');
因此,对于我的查询,每个select是否都是一个单独的@stat?从我看到的情况来看,您的所有查询基本相同。您可以保留一个@stat来执行并使用变量动态设置tablename和where语句。该语句将被包装在BEGIN-END中?我刚刚编写了一个非常基本的语句,我认为您可以很好地使用它,我将在我的回答中对其进行编辑。我明白了,但我如何仍然动态设置db?我想要20个星盘?因为每次传递的db名称可能不同。