以為遊標中沒用數據 過程運行到打開遊標的時候就已經退出了 FETCH a INTO vid,vname; EXIT WHEN a%NOTFOUND;(第一次打開就已經退出,根本沒有判斷下面的條件)建議修改如下:DECLARE vid number(10); vname varchar2(10); CURSOR a IS SELECT id, name from aemp ;BEGIN OPEN a; LOOP if vid is null then insert into adep values(1000); else insert into adep values(2000); end if; FETCH a INTO vid,vname; EXIT WHEN a%NOTFOUND;END LOOP;CLOSE a;commit; END;
--example: SQL> select * from bao_temp 2 /沒有任何資料列被選取SQL> DECLARE 2 3 vid number(10); 4 5 CURSOR a IS 6 SELECT id 7 from bao_temp ; 8 9 BEGIN 10 11 OPEN a; 12 13 LOOP 14 15 FETCH a INTO vid; 16 EXIT WHEN a%NOTFOUND; 17 18 if vid is null then 19 insert into bao_temp values(1000); 20 else 21 insert into bao_temp values(2000); 22 end if; 23 24 END LOOP; 25 26 CLOSE a; 27 28 commit; 29 END; 30 /PL/SQL 程序順利完成目前歷時: 00:00:00.63 SQL> select * from bao_temp 2 /沒有任何資料列被選取目前歷時: 00:00:00.00 SQL> DECLARE 2 3 vid number(10); 4 5 CURSOR a IS 6 SELECT id 7 from bao_temp ; 8 9 BEGIN 10 11 OPEN a; 12 13 LOOP 14 if vid is null then 15 insert into bao_temp values(1000); 16 else 17 insert into bao_temp values(2000); 18 end if; 19 20 FETCH a INTO vid; 21 EXIT WHEN a%NOTFOUND; 22 23 END LOOP; 24 25 CLOSE a; 26 27 commit; 28 END; 29 /PL/SQL 程序順利完成目前歷時: 00:00:00.15 SQL> select * from bao_temp 2 / ID ---------- 1000目前歷時: 00:00:00.47
这是当然的啦 aemp为空,所以cursor a没有纪录 当执行到 FETCH a INTO vid,vname; 时,由于a没有纪录,所以a%notfound为true, 在执行EXIT WHEN a%NOTFOUND;时跳出循环,后面的那个if。。then..else..endif根本就没有执行
先执行 14 if vid is null then 可此时还没得到 20 FETCH a INTO vid;vid,这个变量vid 岂不是成拉不识别的拉?
该段引自:http://www.cnblogs.com/sgsoft/archive/2004/10/15/52881.html loop fetch c_emp into v_id,v_name; --从游标取数据 exit when c_emp%notfound ; end loop ;我们都还没有取凭什么判断vid的直啊 14 if vid is null then
我看懂拉,就是这个地方不明白,是已经在上面定义拉, 可我们还没从course里取数据这句 "FETCH a INTO vid;"不是从course里取数据的意思吗 我们从何判断是vid的直,按照流程: 3 vid number(10);//我懂 14 if vid is null then//我懂 20 FETCH a INTO vid;//我也懂我总觉得20应该在案14的前面执行
很感谢 baojianjun(包子) 是我钻牛角尖吗?執行的順序是按照代碼的先後來執行的 同意,可我们还没执行FETCH a INTO vid;//获得游标里的数据 就判断vid是不是空,我总是不明白
過程運行到打開遊標的時候就已經退出了
FETCH a INTO vid,vname;
EXIT WHEN a%NOTFOUND;(第一次打開就已經退出,根本沒有判斷下面的條件)建議修改如下:DECLARE vid number(10);
vname varchar2(10); CURSOR a IS
SELECT id, name
from aemp ;BEGIN OPEN a; LOOP
if vid is null then
insert into adep values(1000);
else
insert into adep values(2000);
end if;
FETCH a INTO vid,vname;
EXIT WHEN a%NOTFOUND;END LOOP;CLOSE a;commit;
END;
SQL> select * from bao_temp
2 /沒有任何資料列被選取SQL> DECLARE
2
3 vid number(10);
4
5 CURSOR a IS
6 SELECT id
7 from bao_temp ;
8
9 BEGIN
10
11 OPEN a;
12
13 LOOP
14
15 FETCH a INTO vid;
16 EXIT WHEN a%NOTFOUND;
17
18 if vid is null then
19 insert into bao_temp values(1000);
20 else
21 insert into bao_temp values(2000);
22 end if;
23
24 END LOOP;
25
26 CLOSE a;
27
28 commit;
29 END;
30 /PL/SQL 程序順利完成目前歷時: 00:00:00.63
SQL> select * from bao_temp
2 /沒有任何資料列被選取目前歷時: 00:00:00.00
SQL> DECLARE
2
3 vid number(10);
4
5 CURSOR a IS
6 SELECT id
7 from bao_temp ;
8
9 BEGIN
10
11 OPEN a;
12
13 LOOP
14 if vid is null then
15 insert into bao_temp values(1000);
16 else
17 insert into bao_temp values(2000);
18 end if;
19
20 FETCH a INTO vid;
21 EXIT WHEN a%NOTFOUND;
22
23 END LOOP;
24
25 CLOSE a;
26
27 commit;
28 END;
29 /PL/SQL 程序順利完成目前歷時: 00:00:00.15
SQL> select * from bao_temp
2 / ID
----------
1000目前歷時: 00:00:00.47
aemp为空,所以cursor a没有纪录
当执行到 FETCH a INTO vid,vname; 时,由于a没有纪录,所以a%notfound为true,
在执行EXIT WHEN a%NOTFOUND;时跳出循环,后面的那个if。。then..else..endif根本就没有执行
14 if vid is null then
可此时还没得到
20 FETCH a INTO vid;vid,这个变量vid 岂不是成拉不识别的拉?
loop
fetch c_emp into v_id,v_name; --从游标取数据
exit when c_emp%notfound ;
end loop ;我们都还没有取凭什么判断vid的直啊
14 if vid is null then
vid已經在程序頭上定義了,不會不識別的,樓主你看我覺得的例子就可以的
可我们还没从course里取数据这句
"FETCH a INTO vid;"不是从course里取数据的意思吗
我们从何判断是vid的直,按照流程: 3 vid number(10);//我懂
14 if vid is null then//我懂
20 FETCH a INTO vid;//我也懂我总觉得20应该在案14的前面执行
同意,可我们还没执行FETCH a INTO vid;//获得游标里的数据
就判断vid是不是空,我总是不明白