存储过程传入参数与表字段名相同时产生的问题

记得之前写过一篇关于存储过程删除语句的博客,其实就是这个问题,今天又遇到了,问题是我居然搞了好久都没想起来。

下面看代码

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;

所以在存储过程里面千万记得在字段名前面带上表名,这样才能确保不会出问题

posted @ 2016-06-13 16:44  风归云隐  阅读(1817)  评论(0编辑  收藏  举报