我试图创建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查询连接,但它显示如下错误。
请让我知道这个商店的程序。任何帮助都将是感谢。
答案 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
:
WHERE ?
处理,而不是参数化WHERE id = ?
USING
中使用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 演示