光標(biāo)的退出寫在fetch語句前面,為什么會(huì)出現(xiàn)重復(fù)記錄???
fetch cemp into pename,psal;?
??EXIT when cemp%notfound;?
與?
EXIT when cemp%notfound; ?
fetch cemp into pename,psal;?
得出的結(jié)果不一樣,這是為什么?
?第一種方式結(jié)果如下:
?... MILLER的薪水是:1300?
第二種結(jié)果如下:
?... MILLER的薪水是:
1300 MILLER的薪水是:
1300?
第二種最后一條記錄重復(fù)出現(xiàn)兩次是何原因?
2016-03-22
fetch是用來提取游標(biāo)數(shù)據(jù)的,你這樣寫,會(huì)多一次提取數(shù)據(jù)的機(jī)會(huì)
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;
/
輸出結(jié)果:
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
第一次判斷沒跳轉(zhuǎn),只是證明表里有記錄,在取值之前一直是上一條數(shù)據(jù)的記錄。
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;
/
輸出結(jié)果:
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跳到最后一條記錄以后就不會(huì)再報(bào)NULL值了,而是一直保存最有一個(gè)值。
綜上所述:循環(huán)多執(zhí)行了一遍,最后一個(gè)值被多打印了一次!希望對(duì)你有幫助!
2016-01-21
可能是光標(biāo)取值之后,何時(shí)會(huì)跳轉(zhuǎn)到下一條記錄,跟這個(gè)有關(guān),就是在最后一次判斷的時(shí)候光標(biāo)還沒有跳到下一條記錄。