光標的退出寫在fetch語句前面,為什么會出現重復記錄???
fetch cemp into pename,psal;?
??EXIT when cemp%notfound;?
與?
EXIT when cemp%notfound; ?
fetch cemp into pename,psal;?
得出的結果不一樣,這是為什么?
?第一種方式結果如下:
?... MILLER的薪水是:1300?
第二種結果如下:
?... MILLER的薪水是:
1300 MILLER的薪水是:
1300?
第二種最后一條記錄重復出現兩次是何原因?
2016-03-22
fetch是用來提取游標數據的,你這樣寫,會多一次提取數據的機會
2016-01-21
set serveroutput on
declare
cursor s is select ename from emp;
pename emp.ename%type;
begin
open s;
loop
exit when s%notfound;
dbms_output.put_line('before:'||pename);
fetch s into pename;
dbms_output.put_line('after:'||pename);
end loop;
close s;
end;
/
輸出結果:
before:
after:SMITH
before:SMITH
after:ALLEN
before:ALLEN
after:WARD
before:WARD
after:JONES
before:JONES
after:MARTIN
before:MARTIN
after:BLAKE
before:BLAKE
after:CLARK
before:CLARK
after:KING
before:KING
after:TURNER
before:TURNER
after:JAMES
before:JAMES
after:FORD
before:FORD
after:MILLER
before:MILLER
after:MILLER
第一次判斷沒跳轉,只是證明表里有記錄,在取值之前一直是上一條數據的記錄。
set serveroutput on
declare
cursor s is select ename from emp;
pename emp.ename%type;
num number:= 16;
begin
open s;
loop
exit when num<0;
dbms_output.put_line('before:'||pename);
fetch s into pename;
dbms_output.put_line('after:'||pename);
num := num -1;
end loop;
close s;
end;
/
輸出結果:
before:
after:SMITH
before:SMITH
after:ALLEN
before:ALLEN
after:WARD
before:WARD
after:JONES
before:JONES
after:MARTIN
before:MARTIN
after:BLAKE
before:BLAKE
after:CLARK
before:CLARK
after:KING
before:KING
after:TURNER
before:TURNER
after:JAMES
before:JAMES
after:FORD
before:FORD
after:MILLER
before:MILLER
after:MILLER
before:MILLER
after:MILLER
before:MILLER
after:MILLER
before:MILLER
after:MILLER
before:MILLER
after:MILLER
證明fetch跳到最后一條記錄以后就不會再報NULL值了,而是一直保存最有一個值。
綜上所述:循環多執行了一遍,最后一個值被多打印了一次!希望對你有幫助!
2016-01-21
可能是光標取值之后,何時會跳轉到下一條記錄,跟這個有關,就是在最后一次判斷的時候光標還沒有跳到下一條記錄。