【问题标题】:How to pass a subquery as a parameter to a MySQL procedure?如何将子查询作为参数传递给 MySQL 过程?
【发布时间】:2013-08-12 13:26:20
【问题描述】:

有没有办法可以将整个子查询作为参数传递给我的 MySQL 函数并在某个条件下执行它?像这样的东西(但故障较少)..

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

【问题讨论】:

    标签: mysql subquery procedure


    【解决方案1】:

    您可以将查询作为一个好的 ol'string(又名 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');
    

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

    您应该将error handler 添加到这样的过程中,因为可能(根据摩尔定律,最终会;)将损坏的查询作为参数提供。您的程序应该准备好优雅地处理这种情况。

    【讨论】:

    • 感谢您更新您的第一个回复 - 没有解决方法的版本让我一时困惑:D
    • @JaakKütt 另外,请注意,这样的过程可能会允许很多不需要的东西。确保只允许受信任的人运行它。甚至可以用SQL SECURITY INVOKER property 声明它。
    • 感谢您的建议... atm 我只是将它用于测试:)
    【解决方案2】:

    试试这样:

    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 ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-29
      • 2022-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      相关资源
      最近更新 更多