【问题标题】:MySQL - Using stored procedure results to define an IN statementMySQL - 使用存储过程结果定义 IN 语句
【发布时间】:2010-11-17 18:26:32
【问题描述】:

我想使用存储过程来定义 select 语句的 IN 子句。

这是我正在尝试做的(简化版本):

SELECT * 
FROM myTable 
WHERE columnName IN (CALL myStoredProc)

myStoredProc 在数据库中执行一些复杂的逻辑并返回columnName 的可能匹配值列表。上面的陈述显然不起作用。如果有区别,可以在另一个存储过程中执行 select 语句。

这在 mySQL 中完全可能吗?

【问题讨论】:

    标签: sql mysql stored-procedures


    【解决方案1】:

    您当前的存储过程有什么返回类型?您说的是“列表”,所以是 TEXT?

    也许有一种更简单的方法,但您可以做的一件事(在另一个存储过程中)是构建另一个查询。

    为此,我们需要解决 MySQL 的两个限制: a) 要在存储过程中执行动态 SQL,它需要是一个准备好的语句。 b) 准备好的语句只能由用户变量创建。所以完整的SQL是:

    SET @the_list = myStoredProc();
    SET @the_query = CONCAT('SELECT * FROM myTable WHERE columnName IN (' , @the_list , ')');
    PREPARE the_statement FROM @the_query;
    EXECUTE the_statement;
    

    如果您正在谈论从存储的例程返回结果集,然后将其用作表,那是不可能的。您需要创建一个临时表来解决this limitation

    【讨论】:

    • 存储过程返回的结果是一列整数。我需要将其转换为逗号分隔的字符串吗?另外,我尝试实现您的代码(并添加了 SET @the_query ...),但它认为 myStoredProc() 是一个函数并给出错误 FUNCTION database.myStoredProc 不存在。 (错误代码 1305)
    • 还添加了“SET”。 :) 是的,您的过程必须是一个返回任何东西的函数。如果你无论如何都要使用一个临时表,它当然可以保留一个过程。
    猜你喜欢
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 2014-08-02
    • 2012-01-07
    • 2018-05-12
    • 1970-01-01
    相关资源
    最近更新 更多