MySQL选择存储过程与动态查询有什么问题

时间:2013-08-06 04:33:32

标签: mysql stored-procedures

我试图创建MySQL存储过程,因为我想进行动态查询。 我工作的代码..

DELIMITER $$

DROP PROCEDURE IF EXISTS `test`.`selectp` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `selectp`(in a_str_Condition varchar(500))

BEGIN
 SET @Query = 'SELECT * from test123';
IF a_str_Condition != ''
THEN
   SET @strCondition = CONCAT(' WHERE ? ');
   SET @param = a_str_Condition;
ELSE
 SET @strCondition = ' Order by aaa desc';
END IF

SET @Query = CONCAT(@Query, @strCondition );

    PREPARE stmt FROM @Query;
    EXECUTE stmt USING @param;
    DEALLOCATE PREPARE stmt;

END $$

DELIMITER ;

这里我希望传递参数为aaa = 3并将其与mysql查询连接,但它显示如下错误。

enter image description here

请让我知道这个商店的程序。任何帮助都将是感谢。

3 个答案:

答案 0 :(得分:1)

END IF之后你丢了一个分号。

这就是mysql指向你的东西 - 它总是向你显示它无法解析的表达式部分。因此,请始终查看错误描述中的代码。

答案 1 :(得分:1)

END IF语句后应该有一个半列:

ELSE
 SET @strCondition = ' Order by aaa desc';
END IF; //add semicolumn here

在此之前:

SET @Query = CONCAT(@Query, @strCondition );

答案 2 :(得分:1)

尝试回答你的 ...... MySQL选择存储过程有什么问题..?

正如其他人所说,你;失踪了。这只能解决语法错误 但是,您尝试构建查询的方式存在更大的问题,EXECUTE

  1. 您错误地尝试将所有条件作为一个参数用WHERE ?处理,而不是参数化WHERE id = ?
  2. 等值
  3. 如果您未通过条件,则无法在USING中使用EXECUTE。它会失败。
  4. 既然你没有多次执行你的查询,你无论如何都要将条件作为字符串传递,而且似乎你的灵活性比安全性更强,恕我直言,这里使用参数没有多大意义。

    据说你的SP的更简洁版可能看起来像这样

    DELIMITER $$
    CREATE PROCEDURE selectp(IN _conditions VARCHAR(500), IN _orderby VARCHAR(500))
    BEGIN
      SET @sql = CONCAT(
        'SELECT * FROM test123 WHERE 1 = 1',
        COALESCE(CONCAT(' AND ', NULLIF(_conditions, '')), ''),
        ' ORDER BY ',
        COALESCE(NULLIF(_orderby, ''), 'id DESC')
        );
        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END$$
    DELIMITER ;
    

    用法示例:

    -- default parameters either with null or an empty string
    CALL selectp('', '');
    CALL selectp(NULL, NULL);
    -- set where conditions
    CALL selectp('id IN(1, 3)', NULL);
    -- set order by
    CALL selectp(NULL, 'col1 DESC, col2');
    

    这是 SQLFiddle 演示