如何将子查询作为参数传递给MySQL过程?

时间:2013-08-12 13:26:21

标签: mysql subquery procedure

有没有办法可以将整个子查询作为参数传递给我的MySQL函数并在条件下执行?像这样的东西(但不那么缺陷)..

delimiter //
create procedure myFunction (mySubquery)
begin
    if (true) then
        execute mySubquery;
    end if;
    /*rest of the action*/
end //
delimiter ;

2 个答案:

答案 0 :(得分:3)

您可以将查询作为一个好的字符串(a.k.a。VARCHAR)和prepare a statement从中传递出来:

CREATE PROCEDURE proc (param VARCHAR(100))
BEGIN
    SET @query = param;
    PREPARE stmt FROM @query;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    SET @query = NULL;        
END;

-- later on...
CALL proc('SELECT 1');

N.B。丑陋的SET @query = param;解决方法是必需的,因为“在存储的程序上下文中准备的语句不能引用(...)函数参数”。 (即不允许PREPARE stmt FROM param;)。呸。

你应该为这样的程序添加一个error handler,因为一个破碎的查询可能(最终将根据摩尔定律;)作为参数提供。你的程序应该准备好优雅地处理这个案子。

答案 1 :(得分:0)

尝试这样:

delimiter //
drop procedure if exists myFunction;
create procedure myFunction (mySubquery varchar(500))
begin
    if (true) then
        SET @mySubquery = mySubquery;
        PREPARE stmt FROM @mySubquery;
        EXECUTE stmt;
    end if;
/*rest of the action*/
end //
delimiter ;