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

首頁 > 數據庫 > Oracle > 正文

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

2020-07-26 14:14:31
字體:
來源:轉載
供稿:網友

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

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

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

--顯示游標屬性

declareCURSOR cur_emp IS SELECT * FROM emp;row_emp cur_emp%ROWTYPE;BEGINOPEN cur_emp;FETCH cur_emp INTO row_emp;WHILE cur_emp%FOUNDLOOPdbms_output.put_line(row_emp.empno||'----'||row_emp.ename);FETCH cur_emp INTO row_emp;END LOOP;close cur_emp;END;

--使用顯式游標修改數據(給所有的部門經理加薪1000)

DECLARECURSOR emp_cur ISSELECT empno,ename,sal FROM emp WHERE job='MANAGER' FOR UPDATE;emp_row emp_cur%ROWTYPE;BEGINOPEN emp_cur;LOOPFETCH emp_cur INTO emp_row;IF emp_cur%NOTFOUND THENEXIT;ELSEUPDATE emp SET sal=sal+1000 WHERE CURRENT OF emp_cur;END IF;END LOOP;COMMIT;CLOSE emp_cur;END;

?注意:

1、如果游標打開之前或關閉之后,使用游標屬性,Oracle會拋出一個INVALID_CURSOR錯誤(ORA-01001);

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

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

--游標for循環(給所有的部門經理減薪1000)

DECLARECURSOR emp_cur ISSELECT empno,ename,sal FROM emp WHERE job='MANAGER' FOR UPDATE;BEGINFOR emp_row IN emp_curLOOPUPDATE emp SET sal=sal-1000 WHERE CURRENT OF emp_cur;END LOOP;COMMIT;END;

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

--給經理加薪5000,其他加薪1000

DECLARECURSOR emp_cur ISSELECT * FROM emp FOR UPDATE;BEGIN FOR emp_row IN emp_cur LOOP IF emp_row.job='MANAGER' THEN UPDATE emp SET sal=sal+5000 WHERE CURRENT OF emp_cur; ELSE UPDATE emp SET sal=sal+1000 WHERE CURRENT OF emp_cur; END IF; END LOOP; END;

下面給大家介紹oracle游標cursor簡單使用

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

1、cursor游標使用

/*簡單cursor游標  *students表里面有name字段,你可以換做其他表測試  */ --定義 declare  --定義游標并且賦值(is 不能和cursor分開使用)  cursor stus_cur is select * from students;  --定義rowtype  cur_stu students%rowtype;  /*開始執行*/  begin  --開啟游標  open stus_cur;   --loop循環   loop   --循環條件   exit when stus_cur%notfound;   --游標值賦值到rowtype   fetch stus_cur into cur_stu;   --輸出   dbms_output.put_line(cur_stu.name);   --結束循環   end loop;  --關閉游標  close stus_cur;  /*結束執行*/  end; 

 執行結果

SQL> declare   --定義游標并且賦值(is 不能和cursor分開使用)   cursor stus_cur is select * from students;   --定義rowtype   cur_stu students%rowtype;   /*開始執行*/   begin   --開啟游標   open stus_cur;    --loop循環    loop    --循環條件    exit when stus_cur%notfound;    --游標值賦值到rowtype    fetch stus_cur into cur_stu;    --輸出    dbms_output.put_line(cur_stu.name);    --結束循環    end loop;   --關閉游標   close stus_cur;   /*結束執行*/  end;  /  楊過 郭靖 付政委 劉自飛 江風 任我行 任盈盈 令狐沖 韋一笑 張無忌 朵兒 謝遜 小龍女 歐陽鋒 歐陽鋒 

2、sys_refcursor游標使用

/*  *游標名:sys_refcursor  *特別注意賦值方式:for  *與上重復內容不在敘述  */ declare  stu_cur sys_refcursor;  stuone students%rowtype;    begin   --這句賦值方式for   open stu_cur for select * from students;   --fetch賦值給rowtype   fetch stu_cur into stuone;     loop   dbms_output.put_line(stuone.name||' '||stuone.hobby);   fetch stu_cur into stuone;   exit when stu_cur%notfound;   end loop;  end; 

執行結果

SQL> /*   *游標名:sys_refcursor   *特別注意賦值方式:for   *與上重復內容不在敘述   */  declare   stu_cur sys_refcursor;   stuone students%rowtype;   begin   --這句賦值方式for   open stu_cur for select * from students;   --fetch賦值給rowtype   fetch stu_cur into stuone;   loop    dbms_output.put_line(stuone.name||' '||stuone.hobby);    fetch stu_cur into stuone;    exit when stu_cur%notfound;   end loop;   end;  / 楊過 保護小龍女 郭靖 修煉降龍十八掌 付政委 看小人書 劉自飛 編程寫代碼 江風 編程寫代碼 任我行 修煉神功 任盈盈 游山玩水 令狐沖 行俠仗義 韋一笑 吸拾人雪 張無忌 修行 朵兒 洗浴 謝遜 畢生研究屠龍刀 小龍女 修煉玉女心經 歐陽鋒 看小人書 

補充一種循環條件

declare  stu_cur sys_refcursor;  stuone students%rowtype;  begin   open stu_cur for select * from students;   fetch stu_cur into stuone;   --特別注意循環條件的改變   --這個條件是發現了在循環   --與上一個notfound不同的   while stu_cur%found loop   dbms_output.put_line(stuone.name||' '||stuone.hobby);   fetch stu_cur into stuone;   end loop;  end; 

 --普通的fetch into

/*普通方式*/ declare cursor myemp_cur is select * from myemp; v_myemp myemp%rowtype; begin  open myemp_cur;  fetch myemp_cur into v_myemp;  while myemp_cur%found loop  dbms_output.put_line(v_myemp.ename);  fetch myemp_cur into v_myemp;  end loop; end; 

 --高效的bulk collect

/*高效bulk collect for*/ declare cursor myemp_cur is select * from myemp; type myemp_tab is table of myemp%rowtype; myemp_rd myemp_tab; begin  open myemp_cur;  loop  fetch myemp_cur bulk collect into myemp_rd limit 20;  for i in 1..myemp_rd.count loop   dbms_output.put_line('姓名:'||myemp_rd(i).ename);  end loop;  exit when myemp_cur%notfound;  end loop; end; 
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平顶山市| 乌鲁木齐县| 承德市| 鄂伦春自治旗| 仁寿县| 鲁山县| 顺义区| 商城县| 宿迁市| 黄浦区| 巴南区| 项城市| 崇文区| 和政县| 甘南县| 沈阳市| 海安县| 金沙县| 黑山县| 濮阳市| 改则县| 华安县| 台州市| 榆社县| 永新县| 巴东县| 自治县| 聂拉木县| 长寿区| 五大连池市| 西丰县| 五家渠市| 双江| 邹城市| 行唐县| 西华县| 嵊州市| 平武县| 新密市| 砀山县| 阿克|