存储过程传入参数与表字段名相同时产生的问题
记得之前写过一篇关于存储过程删除语句的博客,其实就是这个问题,今天又遇到了,问题是我居然搞了好久都没想起来。
下面看代码
BEGIN /* 更新采集任务状态 */ DECLARE v_id BIGINT; DECLARE v_navclueId BIGINT; DECLARE v_keyWord VARCHAR(255); DECLARE v_path TEXT; DECLARE v_collectStatus VARCHAR(20); DECLARE v_status TINYINT; DECLARE done INT; DECLARE v_ct INT; -- 定义游标 DECLARE cur CURSOR FOR SELECT bk.`RECORDID` recordId,bk.`KEYWORD` keyWord, bk.`WORDPATH` path, bk.`NAVCLUEID` navclueId FROM `bdexpand`.`KEYWORDS` bk INNER JOIN (SELECT `TASKID`,`CREATETIME` FROM `bdexpand`.`TASK` WHERE `AUTHOR`=author LIMIT startPage,pageNumber) bt ON bk.`TASKID`=bt.`TASKID` WHERE bk.`STATUS` != -1 ORDER BY bt.`CREATETIME` DESC; -- 定义结束标记 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; OPEN cur; stuLoop:LOOP FETCH cur INTO v_id, v_keyWord, v_path,v_navclueId; IF done = 1 THEN LEAVE stuLoop; END IF; SELECT v_id; END LOOP stuLoop; CLOSE cur; END
这个存储过程表面看起来没有问题,没有语法错误,运行的时候也不报错,但是仔细查看运行结果,会发现在循环里面输出的数据很多都不是想要的
我本地单独运行下面的语句会得到5条符合要求的数据
SELECT bk.`RECORDID` recordId,bk.`KEYWORD` keyWord, bk.`WORDPATH` path, bk.`NAVCLUEID` navclueId FROM `bdexpand`.`KEYWORDS` bk INNER JOIN (SELECT `TASKID`,`CREATETIME` FROM `bdexpand`.`TASK` WHERE `AUTHOR`=author LIMIT startPage,pageNumber) bt ON bk.`TASKID`=bt.`TASKID` WHERE bk.`STATUS` != -1 ORDER BY bt.`CREATETIME` DESC;
但是运行存储过程会输出十多条数据,很多都不满足 `AUTHOR`=author 这个条件,为什么会出现这种情况?
MYSQL的存储过程传入参数(author)如果与表字段名(`AUTHOR`)相同(不区分大小写),存储过程就会把这个约束条件忽略,如上面的语句放到存储过程中就相当于
SELECT bk.`RECORDID` recordId,bk.`KEYWORD` keyWord, bk.`WORDPATH` path, bk.`NAVCLUEID` navclueId FROM `bdexpand`.`KEYWORDS` bk INNER JOIN (SELECT `TASKID`,`CREATETIME` FROM `bdexpand`.`TASK` LIMIT startPage,pageNumber) bt ON bk.`TASKID`=bt.`TASKID` WHERE bk.`STATUS` != -1 ORDER BY bt.`CREATETIME` DESC;
所以在存储过程里面千万记得在字段名前面带上表名,这样才能确保不会出问题