-1

我试图创建 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 查询连接,但它显示如下错误。

在此处输入图像描述

请让我清楚这个商店的程序。任何帮助将不胜感激。

4

3 回答 3

1

您在 之后丢失了一个分号END IF

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

于 2013-08-06T04:38:48.200 回答
1

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

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

在此行之前:

SET @Query = CONCAT(@Query, @strCondition );
于 2013-08-06T04:38:53.807 回答
1

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

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

  1. 您错误地尝试将所有 where 条件视为一个参数WHERE ?,而不是像WHERE id = ?
  2. 如果你没有通过一个你不能使用USINGin的条件EXECUTE。它会失败。

现在,由于您没有多次执行查询,因此无论如何您都将条件作为字符串传递,而且您似乎更注重灵活性而不是安全性,恕我直言,在这里使用参数没有多大意义。

话虽这么说,您的 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演示

于 2013-08-06T05:26:58.793 回答