存储过程中SELECT语句异常:AND条件却返回OR式查询结果
问题解决方法
你的问题出在存储过程参数名和视图列名重名:参数product_name和stock_order_view里的列名完全一致,MySQL解析WHERE product_name=product_name时,会把两边的product_name都识别为视图的列名,这就变成了“列值等于自身”——这个条件对所有行都成立,相当于没加产品名的筛选。最终你的WHERE子句实际只生效了日期筛选,但因为第一个条件恒真,导致结果范围远超预期。
修改方案
最简单的解决方式是给参数起一个和列名不重复的名字,比如加前缀p_,修改后的存储过程代码如下:
CREATE DEFINER=`root`@`localhost` PROCEDURE `find_stock_order`( in p_product_name varchar(45), in thedate date) BEGIN SELECT * from stock_order_view WHERE product_name = p_product_name AND DateTime_order = thedate; END
如果不想修改参数名,也可以用存储过程名来限定参数,明确告诉MySQL你引用的是参数而非列:
CREATE DEFINER=`root`@`localhost` PROCEDURE `find_stock_order`( in product_name varchar(45), in thedate date) BEGIN SELECT * from stock_order_view WHERE stock_order_view.product_name = find_stock_order.product_name AND DateTime_order = thedate; END
修改后,MySQL就能正确区分传入的参数值和视图的列值,WHERE条件会同时检查两个筛选规则,只返回同时满足产品名匹配且日期匹配的数据行。
内容的提问来源于stack exchange,提问作者Him
相关产品推荐
相关产品推荐

