游标属性%notfound,因为exit语句返回令人困惑的结果

时间:2015-11-20 03:48:26

标签: sql oracle loops

#instafeed {
  width: 100%;
  margin:0px;
}
#instafeed a {
  position: relative;
  display:inline-block;
  float:left;
  width: 25%;
}
#instafeed .ig-photo {
  width: 100%;
  vertical-align: middle;
}
#instafeed .likes {
  position: absolute;
    width: 100%;
  opacity: 0;
  font-family: 'LinotypeUniversW01-Thin_723604', Arial, sans-serif;
  font-size: 28px;
  color: #ffffff;
  text-align: center;
  top: 50%;
  transform: translateY(-50%);  
  text-shadow: 0 1px rgba(0,0,0,0.5);
  -webkit-font-smoothing: antialiased;
  -webkit-transition: opacity 100ms ease;
    -moz-transition: opacity 100ms ease;
    -o-transition: opacity 100ms ease;
    -ms-transition: opacity 100ms ease;
    transition: opacity 100ms ease;
    z-index:10;
}
#instafeed a:hover .likes {
  opacity: 1;
}
#instafeed a:hover::after{
    content:"";
    position:absolute;
    width: 100%;
    height: 100%;
    top: 0; left: 0;
    background: #f18a21;
    opacity:0.7;
    z-index: 5;
}

我的上述查询基本上遍历100到105之间的所有DECLARE i employees.first_name%TYPE; a employees.last_name%TYPE; j employees.salary%TYPE; v_cnt NUMBER; CURSOR c1 IS SELECT first_name ,last_name ,salary FROM employees WHERE employee_id BETWEEN 100 AND 105; BEGIN OPEN c1; LOOP FETCH c1 INTO i, a, j; dbms_output.put_line(i || ' ' || a || ' SALARY IS ' || j || ' row count is ' || v_cnt); v_cnt := c1%ROWCOUNT; EXIT WHEN c1%NOTFOUND; END LOOP; CLOSE c1; END; / 并打印所有6名员工'使用employee_id的工资。

但是,我得到7个结果,最后一个结果是前一个记录的重复结果。见下文

dbms_output.put_line

为什么我的结果会像这样返回?为什么我的游标rowcount将第一条记录标记为1?

1 个答案:

答案 0 :(得分:2)

    第一次调用v_cnt时,
  1. IS NULL未初始化,即dbms_output.put_line,因此您会在输出中看到空行而不是行号。
  2. 最后一次提取不执行任何操作,因为游标中没有更多行,因此变量i, a, j在最后一次提取后不会更改。您可以根据需要获取,但是在从游标中取出最后一行之后,FETCH INTO运算符不会生成新数据。
  3. 为了得到你需要的东西(标准循环行为),抓取循环应该被组织为

    LOOP
        FETCH c1 INTO i, a, j;
        EXIT WHEN c1%NOTFOUND;
        v_cnt := c1%ROWCOUNT; 
    
        dbms_output.put_line(i || ' ' || a || ' SALARY IS ' || j || ' row count is ' || v_cnt);
    
    END LOOP;
    

    为避免提取光标,可以使用“for loop”来完成。 在大多数情况下,这是一个合适的解决方案,绝对是您在问题中提供的示例。

    FOR l_rec IN c1
    LOOP
    
      i := l_rec.first_name;
      a := l_rec.last_name;
      j := l_rec.salary;
      v_cnt := c1%ROWCOUNT;
    
      dbms_output.put_line(i || ' ' || a || ' SALARY IS ' || j || ' row count is ' || v_cnt);
    
    END LOOP;