[英]Select Query with Stored Procedure
I want to call a procedure with some conditions, This is my code. 我想在某些条件下调用过程,这是我的代码。
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 ;
procedure call - CALL view_all_user_details_with_limit(0,10,'',"NAME LIKE '%a%'");
过程调用
CALL view_all_user_details_with_limit(0,10,'',"NAME LIKE '%a%'");
but I dont get any result. 但我没有任何结果。 why ????
为什么?
If you want to have variable WHERE
, LIMIT
, and ORDER BY
conditions, you will need to create a prepared statement in your stored procedure. 如果要具有变量
WHERE
, LIMIT
和ORDER BY
条件,则需要在存储过程中创建一个准备好的语句。
Try something like this: 尝试这样的事情:
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 ;
Your problem seems to be happening in WHERE Cond
. 您的问题似乎在
WHERE Cond
发生。
A MySQL Stored Procedure won't interpret that string as an expression, but will instead attempt to cast it to a Boolean. MySQL存储过程不会将该字符串解释为表达式,而是尝试将其转换为布尔值。
You can see by running SELECT CAST("NAME LIKE '%a%'" AS UNSIGNED);
您可以通过运行
SELECT CAST("NAME LIKE '%a%'" AS UNSIGNED);
来查看SELECT CAST("NAME LIKE '%a%'" AS UNSIGNED);
that the string will be interpreted as False, and thereby you won't get any results. 该字符串将被解释为False,因此您将不会获得任何结果。
I suggest instead that you accept in your Cond variable a string such as '%a%'
and then update your query to: 我建议您在Cond变量中接受一个字符串,例如
'%a%'
,然后将查询更新为:
SELECT *
FROM `tbl_user_details`
WHERE `NAME` LIKE Cond
ORDER BY OrderVal
LIMIT StartNo, EndNo;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.