在清理输入存储过程中使用预准备语句的任何一点?

时间:2012-10-12 23:04:16

标签: mysql stored-procedures prepared-statement

我不是数据库专家,但是我继承了一个相当大的生产MySQL数据库的责任,这个数据库来自一个看起来有点严重不称职的人,但偶尔会有耀眼的光彩。大多数问题我都能够自己解决,但是这个问题让我很难过,而且我还没有看到任何解决它的问题:

有没有理由让一个存储过程只不过是一个预准备语句的包装器?

这些方面的东西:

CREATE PROCEDURE foo_search (IN searchParam1 int, IN searchParam2 varchar(255))
BEGIN
    SET @local1 = searchParam1;
    SET @local2 = searchParam2;
    PREPARE stmt FROM 
        '...'; --Fairly complex nested select statement
    EXECUTE stmt USING @local1, @local2;
END

就是这样。我对准备好的语句的理解是,它们的好处在于清理输入(已经由我们使用的PHP框架处理),并且来回减少通信(在存储过程中受到损害)。

这看起来是纯粹而简单的毫无意义的疯狂,还是我错过了什么?

2 个答案:

答案 0 :(得分:0)

可能有。

也许那个人正在使用不支持预处理语句的数据库连接库,所以他只是希望获得相同的效果。

也许他想从触发器调用该存储过程。

答案 1 :(得分:0)

迈克列出了两个很好的理由。这里有几个:

  1. 减少网络流量,因为CALL foo_search(searchParam1, searchParam2)每次发送整个SQL语句的数据会少于数据。

  2. 在服务器上准备语句可以提高性能。在对几种不同的方法进行基准测试后,我们发现对于复杂的SQL语句,只准备一次语句, 在服务器上 ,表现最佳。这是一个例子:


  3. CREATE PROCEDURE foo_search (IN searchParam1 int, IN searchParam2 varchar(255))
    BEGIN
        SET @local1 = searchParam1;
        SET @local2 = searchParam2;
        IF ISNULL(@foo_search_prepared) THEN
            SET @foo_search_prepared = TRUE;
    
            PREPARE stmt FROM 
                '...'; --Fairly complex nested select statement
        END IF; 
        EXECUTE stmt USING @local1, @local2;
    END