存储过程传入参数与表字段名相同时产生的问题
生活随笔
收集整理的这篇文章主要介绍了
存储过程传入参数与表字段名相同时产生的问题
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
记得之前写过一篇关于存储过程删除语句的博客,其实就是这个问题,今天又遇到了,问题是我居然搞了好久都没想起来。
下面看代码
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:LOOPFETCH cur INTO v_id, v_keyWord, v_path,v_navclueId;IF done = 1 THENLEAVE 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;所以在存储过程里面千万记得在字段名前面带上表名,这样才能确保不会出问题
转载于:https://www.cnblogs.com/quyixuanblog/p/5581185.html
总结
以上是生活随笔为你收集整理的存储过程传入参数与表字段名相同时产生的问题的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 【Spring-AOP-1】AOP相关概
- 下一篇: 缓存淘汰算法 (http://flych