我想调用一个带有某些条件的过程, 这是我的代码。
DELIMITER $$
USE `jijo_db`$$
DROP PROCEDURE IF EXISTS `view_all_user_details_with_limit`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `view_all_user_details_with_limit`(IN StartNo INT,IN EndNo INT, IN OrderVal VARCHAR(10),IN Cond VARCHAR(50))
BEGIN
SELECT * FROM `tbl_user_details` WHERE Cond ORDER BY OrderVal LIMIT StartNo,EndNo;
END$$
DELIMITER ;
程序调用-CALL view_all_user_details_with_limit(0,10,'',"NAME LIKE '%a%'");
但我没有得到任何结果。为什么????
答案 0 :(得分:2)
如果要具有变量WHERE
,LIMIT
和ORDER BY
条件,则需要在存储过程中创建准备好的语句。
尝试这样的事情:
DELIMITER $$
USE `jijo_db`$$
DROP PROCEDURE IF EXISTS `view_all_user_details_with_limit`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `view_all_user_details_with_limit`(IN StartNo INT,IN EndNo INT, IN OrderVal VARCHAR(10),IN Cond VARCHAR(50))
BEGIN
SET @q = CONCAT('SELECT * FROM `tbl_user_details` WHERE ', Cond);
IF OrderVal != '' THEN
SET @q = CONCAT(@q, ' ORDER BY ', OrderVal);
END IF;
SET @q = CONCAT(@q, ' LIMIT ', StartNo, ', ', EndNo - StartNo + 1);
PREPARE stmt FROM @q;
EXECUTE stmt;
END$$
DELIMITER ;
答案 1 :(得分:1)
您的问题似乎在WHERE Cond
中发生。
MySQL存储过程不会将该字符串解释为表达式,而是尝试将其转换为布尔值。
通过运行SELECT CAST("NAME LIKE '%a%'" AS UNSIGNED);
可以看到该字符串将被解释为False,因此您将不会获得任何结果。
相反,我建议您在Cond变量中接受诸如'%a%'
之类的字符串,然后将查询更新为:
SELECT *
FROM `tbl_user_details`
WHERE `NAME` LIKE Cond
ORDER BY OrderVal
LIMIT StartNo, EndNo;