国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > Oracle > 正文

Oracle顯示游標(biāo)的使用及游標(biāo)for循環(huán)

2024-08-29 13:58:32
字體:
供稿:網(wǎng)友

本篇文章給大家介紹oracle顯示游標(biāo)的使用及游標(biāo)for循環(huán),當(dāng)查詢返回單行記錄時(shí)使用隱式游標(biāo),查詢返回多行記錄并逐行進(jìn)行處理時(shí)使用顯式游標(biāo),對本文感興趣的朋友一起學(xué)習(xí)吧

下面給大家介紹在什么情況下用隱式游標(biāo),什么情況下用顯示游標(biāo):

1.查詢返回單行記錄時(shí)→隱式游標(biāo);

2.查詢返回多行記錄并逐行進(jìn)行處理時(shí)→顯式游標(biāo)

--顯示游標(biāo)屬性

 

 
  1. declare 
  2. CURSOR cur_emp IS SELECT * FROM emp; 
  3. row_emp cur_emp%ROWTYPE; 
  4. BEGIN 
  5. OPEN cur_emp; 
  6. FETCH cur_emp INTO row_emp; 
  7. WHILE cur_emp%FOUND 
  8. LOOP 
  9. dbms_output.put_line(row_emp.empno||'----'||row_emp.ename); 
  10. FETCH cur_emp INTO row_emp; 
  11. END LOOP; 
  12. close cur_emp; 
  13. END; 

--使用顯式游標(biāo)修改數(shù)據(jù)(給所有的部門經(jīng)理加薪1000)

 

 
  1. DECLARE 
  2. CURSOR emp_cur IS 
  3. SELECT empno,ename,sal FROM emp WHERE job='MANAGER' FOR UPDATE; 
  4. emp_row emp_cur%ROWTYPE; 
  5. BEGIN 
  6. OPEN emp_cur; 
  7. LOOP 
  8. FETCH emp_cur INTO emp_row; 
  9. IF emp_cur%NOTFOUND THEN 
  10. EXIT; 
  11. ELSE 
  12. UPDATE emp SET sal=sal+1000 WHERE CURRENT OF emp_cur; 
  13. END IF; 
  14. END LOOP; 
  15. COMMIT; 
  16. CLOSE emp_cur; 
  17. END; 

·注意:

1、如果游標(biāo)打開之前或關(guān)閉之后,使用游標(biāo)屬性,Oracle會拋出一個(gè)INVALID_CURSOR錯(cuò)誤(ORA-01001);

2、如果在第一次fetch后結(jié)果集是空的,%found=false,%NotFound=true,%ROWCOUNT=0;

3、如果使用了BULK COLLECT,那么%ROWCOUNT的值可能不是0或1,實(shí)際上他返回的是提取到相關(guān)集合的行數(shù)。

--游標(biāo)for循環(huán)(給所有的部門經(jīng)理減薪1000)

 

 
  1. DECLARE 
  2. CURSOR emp_cur IS 
  3. SELECT empno,ename,sal FROM emp WHERE job='MANAGER' FOR UPDATE; 
  4. BEGIN 
  5. FOR emp_row IN emp_cur 
  6. LOOP 
  7. UPDATE emp SET sal=sal-1000 WHERE CURRENT OF emp_cur; 
  8. END LOOP; 
  9. COMMIT; 
  10. END; 

--我們可以看到游標(biāo)FOR循環(huán)確實(shí)很好的簡化了游標(biāo)的開發(fā),我們不在需要open、fetch和close語句,不在需要用%FOUND屬性檢測是否到最后一條記錄,這一切Oracle隱式的幫我們完成了。

--給經(jīng)理加薪5000,其他加薪1000

 

 
  1. DECLARE 
  2. CURSOR emp_cur IS 
  3. SELECT * FROM emp FOR UPDATE; 
  4. BEGIN 
  5. FOR emp_row IN emp_cur 
  6. LOOP 
  7. IF emp_row.job='MANAGER' THEN 
  8. UPDATE emp SET sal=sal+5000 WHERE CURRENT OF emp_cur; 
  9. ELSE 
  10. UPDATE emp SET sal=sal+1000 WHERE CURRENT OF emp_cur; 
  11. END IF; 
  12. END LOOP; 
  13. END; 

下面給大家介紹oracle游標(biāo)cursor簡單使用

總共介紹兩種游標(biāo)一種高效使用游標(biāo)cursor 、sys_refcursor 、 bulk collect

1、cursor游標(biāo)使用

 

 
  1. /*簡單cursor游標(biāo)  
  2. *students表里面有name字段,你可以換做其他表測試  
  3. */  
  4. --定義  
  5. declare 
  6. --定義游標(biāo)并且賦值(is 不能和cursor分開使用)  
  7. cursor stus_cur is select * from students;  
  8. --定義rowtype  
  9. cur_stu students%rowtype;  
  10. /*開始執(zhí)行*/  
  11. begin 
  12. --開啟游標(biāo)  
  13. open stus_cur;  
  14. --loop循環(huán)  
  15. loop  
  16. --循環(huán)條件  
  17. exit when stus_cur%notfound;  
  18. --游標(biāo)值賦值到rowtype  
  19. fetch stus_cur into cur_stu;  
  20. --輸出  
  21. dbms_output.put_line(cur_stu.name);  
  22. --結(jié)束循環(huán)  
  23. end loop;  
  24. --關(guān)閉游標(biāo)  
  25. close stus_cur;  
  26. /*結(jié)束執(zhí)行*/  
  27. end; 

執(zhí)行結(jié)果

 

 
  1. SQL> declare 
  2. --定義游標(biāo)并且賦值(is 不能和cursor分開使用)  
  3. cursor stus_cur is select * from students;  
  4. --定義rowtype  
  5. cur_stu students%rowtype;  
  6. /*開始執(zhí)行*/  
  7. begin 
  8. --開啟游標(biāo)  
  9. open stus_cur;  
  10. --loop循環(huán)  
  11. loop  
  12. --循環(huán)條件  
  13. exit when stus_cur%notfound;  
  14. --游標(biāo)值賦值到rowtype  
  15. fetch stus_cur into cur_stu;  
  16. --輸出  
  17. dbms_output.put_line(cur_stu.name);  
  18. --結(jié)束循環(huán)  
  19. end loop;  
  20. --關(guān)閉游標(biāo)  
  21. close stus_cur;  
  22. /*結(jié)束執(zhí)行*/  
  23. end;  
  24. /  
  25.  
  26. 楊過  
  27. 郭靖  
  28. 付政委  
  29. 劉自飛  
  30. 江風(fēng)  
  31. 任我行  
  32. 任盈盈  
  33. 令狐沖  
  34. 韋一笑  
  35. 張無忌  
  36. 朵兒  
  37. 謝遜  
  38. 小龍女  
  39. 歐陽鋒  
  40. 歐陽鋒 

2、sys_refcursor游標(biāo)使用

 

 
  1. /*  
  2. *游標(biāo)名:sys_refcursor  
  3. *特別注意賦值方式:for 
  4. *與上重復(fù)內(nèi)容不在敘述  
  5. */  
  6. declare 
  7. stu_cur sys_refcursor;  
  8. stuone students%rowtype;  
  9.  
  10. begin 
  11. --這句賦值方式for  
  12. open stu_cur for select * from students;  
  13. --fetch賦值給rowtype  
  14. fetch stu_cur into stuone;  
  15.  
  16. loop  
  17. dbms_output.put_line(stuone.name||' '||stuone.hobby);  
  18. fetch stu_cur into stuone;  
  19. exit when stu_cur%notfound;  
  20. end loop;  
  21. end; 

執(zhí)行結(jié)果

 

 
  1. SQL> /*  
  2. *游標(biāo)名:sys_refcursor  
  3. *特別注意賦值方式:for 
  4. *與上重復(fù)內(nèi)容不在敘述  
  5. */  
  6. declare 
  7. stu_cur sys_refcursor;  
  8. stuone students%rowtype;  
  9. begin 
  10. --這句賦值方式for  
  11. open stu_cur for select * from students;  
  12. --fetch賦值給rowtype  
  13. fetch stu_cur into stuone;  
  14. loop  
  15. dbms_output.put_line(stuone.name||' '||stuone.hobby);  
  16. fetch stu_cur into stuone;  
  17. exit when stu_cur%notfound;  
  18. end loop;  
  19. end;  
  20. /  
  21. 楊過 保護(hù)小龍女  
  22. 郭靖 修煉降龍十八掌  
  23. 付政委 看小人書  
  24. 劉自飛 編程寫代碼  
  25. 江風(fēng) 編程寫代碼  
  26. 任我行 修煉神功  
  27. 任盈盈 游山玩水  
  28. 令狐沖 行俠仗義  
  29. 韋一笑 吸拾人雪  
  30. 張無忌 修行  
  31. 朵兒 洗浴  
  32. 謝遜 畢生研究屠龍刀  
  33. 小龍女 修煉玉女心經(jīng)  
  34. 歐陽鋒 看小人書 

補(bǔ)充一種循環(huán)條件

 

 
  1. declare 
  2. stu_cur sys_refcursor;  
  3. stuone students%rowtype;  
  4. begin 
  5. open stu_cur for select * from students;  
  6. fetch stu_cur into stuone;  
  7. --特別注意循環(huán)條件的改變  
  8. --這個(gè)條件是發(fā)現(xiàn)了在循環(huán)  
  9. --與上一個(gè)notfound不同的  
  10. while stu_cur%found loop  
  11. dbms_output.put_line(stuone.name||' '||stuone.hobby);  
  12. fetch stu_cur into stuone;  
  13. end loop;  
  14. end; 

--普通的fetch into

 

 
  1. /*普通方式*/  
  2. declare 
  3. cursor myemp_cur is select * from myemp;  
  4. v_myemp myemp%rowtype;  
  5. begin 
  6. open myemp_cur;  
  7. fetch myemp_cur into v_myemp;  
  8. while myemp_cur%found loop  
  9. dbms_output.put_line(v_myemp.ename);  
  10. fetch myemp_cur into v_myemp;  
  11. end loop;  
  12. end; 

--高效的bulk collect

 

 
  1. /*高效bulk collect for*/  
  2. declare 
  3. cursor myemp_cur  
  4. is select * from myemp;  
  5. type myemp_tab is table of myemp%rowtype;  
  6. myemp_rd myemp_tab;  
  7. begin 
  8. open myemp_cur;  
  9. loop  
  10. fetch myemp_cur bulk collect into myemp_rd limit 20;  
  11. for i in 1..myemp_rd.count loop  
  12. dbms_output.put_line('姓名:'||myemp_rd(i).ename);  
  13. end loop;  
  14. exit when myemp_cur%notfound;  
  15. end loop;  
  16. end; 


注:相關(guān)教程知識閱讀請移步到oracle教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 句容市| 金阳县| 清河县| 新晃| 泗洪县| 漳浦县| 汨罗市| 来宾市| 兴国县| 永福县| 岑溪市| 蓝田县| 河津市| 涟水县| 泰州市| 贡觉县| 新和县| 赣榆县| 仙居县| 工布江达县| 宁海县| 宁海县| 北安市| 三河市| 皮山县| 奉化市| 米易县| 苏尼特右旗| 深泽县| 西青区| 蓬安县| 蕉岭县| 图们市| 神木县| 弥勒县| 田林县| 美姑县| 平和县| 卢湾区| 霍城县| 杨浦区|