a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 數據庫 > Oracle > 正文

Oracle顯示游標的使用及游標for循環

2024-08-29 13:58:32
字體:
來源:轉載
供稿:網友

本篇文章給大家介紹oracle顯示游標的使用及游標for循環,當查詢返回單行記錄時使用隱式游標,查詢返回多行記錄并逐行進行處理時使用顯式游標,對本文感興趣的朋友一起學習吧

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

1.查詢返回單行記錄時→隱式游標;

2.查詢返回多行記錄并逐行進行處理時→顯式游標

--顯示游標屬性

 

 
  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; 

--使用顯式游標修改數據(給所有的部門經理加薪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、如果游標打開之前或關閉之后,使用游標屬性,Oracle會拋出一個INVALID_CURSOR錯誤(ORA-01001);

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

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

--游標for循環(給所有的部門經理減薪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; 

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

--給經理加薪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游標cursor簡單使用

總共介紹兩種游標一種高效使用游標cursor 、sys_refcursor 、 bulk collect

1、cursor游標使用

 

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

執行結果

 

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

2、sys_refcursor游標使用

 

 
  1. /*  
  2. *游標名:sys_refcursor  
  3. *特別注意賦值方式:for 
  4. *與上重復內容不在敘述  
  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; 

執行結果

 

 
  1. SQL> /*  
  2. *游標名:sys_refcursor  
  3. *特別注意賦值方式:for 
  4. *與上重復內容不在敘述  
  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. 楊過 保護小龍女  
  22. 郭靖 修煉降龍十八掌  
  23. 付政委 看小人書  
  24. 劉自飛 編程寫代碼  
  25. 江風 編程寫代碼  
  26. 任我行 修煉神功  
  27. 任盈盈 游山玩水  
  28. 令狐沖 行俠仗義  
  29. 韋一笑 吸拾人雪  
  30. 張無忌 修行  
  31. 朵兒 洗浴  
  32. 謝遜 畢生研究屠龍刀  
  33. 小龍女 修煉玉女心經  
  34. 歐陽鋒 看小人書 

補充一種循環條件

 

 
  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. --特別注意循環條件的改變  
  8. --這個條件是發現了在循環  
  9. --與上一個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; 


注:相關教程知識閱讀請移步到oracle教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 中文一二区| 亚洲免费精品 | 综合网亚洲 | 国产不卡在线播放 | 九九热精品在线观看 | 国产在线精品一区二区 | 欧美日韩中文国产一区发布 | 日韩美女视频 | 亚洲一区欧美一区 | 国产精品一区二区三区在线免费观看 | 亚洲综合大片69999 | 国产精品久久久久一区二区三区 | 午夜视频观看 | 99久久久国产精品美女 | 欧美日韩一区在线 | 成人男女激情免费视频 | 青青草娱乐视频 | 久久另类ts人妖一区二区 | 精品国产31久久久久久 | 欧美午夜精品久久久久免费视 | 欧美一级一区 | 欧美大片在线看免费观看 | 麻豆精品国产91久久久久久 | 久久免费精品视频 | a视频在线观看 | 成人免费视频视频在线观看 免费 | 日韩精品观看 | 国产精品一区久久久久 | 亚洲毛片网站 | 成人做爰999 | 九九免费在线观看 | 伊人在线 | 日韩欧美中文在线 | 日韩精品网 | www.精品| 观看av | 日韩高清国产一区在线 | 一本色道久久综合狠狠躁篇的优点 | 北条麻妃99精品青青久久 | 精品超碰 | 91秦先生艺校小琴 |