麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數據庫 > 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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 成年性羞羞视频免费观看 | 精品一区二区三区网站 | 日本在线播放一区二区三区 | 在线天堂中文在线资源网 | 毛片免费看的 | 在线播放免费av | 欧美日韩中文字幕在线 | 天天看天天摸天天操 | 毛片大全 | 色柚视频网站ww色 | 国产亚洲精品久久久久久网站 | 成人毛片100免费观看 | 成人羞羞在线观看网站 | 亚洲网站在线观看 | 看一级毛片 | 久久精品成人免费国产片桃视频 | 成人免费看毛片 | 亚洲爱爱网站 | 一区二区三区视频在线 | 人成久久 | 国产精品成人一区二区三区吃奶 | 他也色在线视频 | 一级毛片特黄 | 中国老女人一级毛片视频 | 欧美成人免费电影 | 欧美一级黄色免费 | 一级国产精品一级国产精品片 | 女人裸体让男人桶全过程 | 精品一区二区三区欧美 | 一级啪啪片 | 久久久久久久久淑女av国产精品 | 国产又白又嫩又紧又爽18p | 日本精品视频一区二区三区四区 | 久久影院国产精品 | 欧美h版电影在线观看 | 免费观看一级欧美大 | 韩国十九禁高潮床戏在线观看 | 精品国产91久久久久久久 | 亚洲国产精久久久久久久 | 亚洲特黄a级毛片在线播放 久久久入口 | 蜜桃网在线 |