简体   繁体   English

选择查询存储过程

[英]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. 如果要具有变量WHERELIMITORDER 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM