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


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

    下面看代码

    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;

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

  • 相关阅读:
    SharePoint中获取当前登录的用户名
    SharePoint 2013 图文开发系列之InfoPath入门
    在InfoPath中如何获取当前用户的信息(Profile)
    更新当前列并添加其他列
    poj3067 Japan
    poj2481 Cows
    poj1195 Mobile phones
    poj2299 Ultra-QuickSort
    lower_bound()和upper_bound
    hdu4339 Query
  • 原文地址:https://www.cnblogs.com/quyixuanblog/p/5581185.html
Copyright © 2020-2023  润新知