选择查询存储过程

时间:2018-08-28 04:37:51

标签: mysql select stored-procedures

我想调用一个带有某些条件的过程, 这是我的代码。

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%'");

但我没有得到任何结果。为什么????

2 个答案:

答案 0 :(得分:2)

如果要具有变量WHERELIMITORDER 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;