使用函数动态生成查询

Posted

技术标签:

【中文标题】使用函数动态生成查询【英文标题】:Dynamically generating query using function 【发布时间】:2017-07-01 07:16:19 【问题描述】:

我刚开始学习在mysql 中使用定义的函数,并且尝试了一些基本示例,但是当我尝试返回varchar 的函数时,它实际上返回了select query 的一部分,它给了我一些意想不到的东西。

数据库中有很多表,其列为idname,因此每当人们想要为特定的name 获取id 或反之亦然时,他们都会进入表并手动获取数据。所以我试图创建一个可以使过程更顺畅的函数。

这是我的功能

create function getTableDetails(table_name varchar(20), id int(5), name varchar(20)) 
returns varchar(50)
begin
    return " * from " + table_name + " where id = " + id + 
               " or name like '%" + name + "%'";
end

如您所见,我正在尝试概括所有表的查询,它返回除 select 关键字之外的所有内容。

现在我的查询将类似于select getTableDetails('classes', 2, 'a')

假设函数的返回将填充查询的其余部分并给我表数据,但我得到的结果集是

getTableDetails('classes'; 2; 'a')
2

getTableDetails('classes'; 2; 'a') 是标题。

我哪里错了?

【问题讨论】:

【参考方案1】:

您不能从命令行动态生成和执行这样的查询。您需要使用 preparedstatement 以及存储过程中的那个,例如:

SET @query = CONCAT('select', getTableDetails('classes', 2, 'a'));

PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

【讨论】:

我猜测的是什么时候执行SELECT查询时函数将首先执行,然后查询将执行。我的假设写了吗?您能否在答案中解释该查询执行的流程? SELECT 查询被调用时,函数被执行。但是,它会导致查询本身并且不会动态执行。因此,您将通过执行该选择查询得到string(另外,我相信您应该使用CONCAT 而不是+)。如果您希望此结果查询再次执行,则需要使用准备好的语句。查看 MySQL 的文档here。

以上是关于使用函数动态生成查询的主要内容,如果未能解决你的问题,请参考以下文章

动态生成 LINQ 查询

在 Freemarker 中使用动态生成的名称调用函数

对表使用 sql server 2005 同义词会导致动态查询生成错误

如何使用 .map 函数索引切换动态生成的下拉列表?

TSQL - 从记录集中动态生成查询

如何在 jQuery 中获取动态创建的输入的单选值