游标操作 for Oracle
游標用來處理從數據庫中檢索的多行記錄(使用SELECT語句)。利用游標,程序可以逐個地處理和遍歷一次檢索返回的整個記錄集。
?????為了處理SQL語句,Oracle將在內存中分配一個區域,這就是上下文區。這個區包含了已經處理完的行數、指向被分析語句的指針,整個區是查詢語句返回的數據行集。游標就是指向上下文區句柄或指針。
兩種游標:
一、顯示游標(需要明確定義!)
????顯示游標被用于處理返回多行數據的SELECT 語句,游標名通過CURSOR….IS 語句顯示地賦給SELECT 語句。
?????? 在PL/SQL中處理顯示游標所必需的四個步驟:
?????? 1)聲明游標;CURSOR cursor_name IS select_statement
?????? 2)為查詢打開游標;OPEN cursor_name
?????? 3)取得結果放入PL/SQL變量中;
????????????? FETCH cursor_name INTO list_of_variables;
????????????? FETCH cursor_name INTO PL/SQL_record;
?????? 4)關閉游標。CLOSE cursor_name
?????? 注意:在聲明游標時,select_statement不能包含INTO子句。當使用顯示游標時,INTO子句是FETCH語句的一部分。
???1、 顯式游標
????? select語句上 使用顯式游標
????? 能明確訪問結果集
???????? for循環游標
???????? 參數游標
?????????? 解決多行記錄的查詢問題
???????? fetch游標
二、隱式游標?
?????? 所有的隱式游標都被假設為只返回一條記錄。
?????? 使用隱式游標時,用戶無需進行聲明、打開及關閉。PL/SQL隱含地打開、處理,然后關掉游標。
?????? 例如:
?????? …….
?????? SELECT studentNo,studentName
?????? INTO curStudentNo,curStudentName
?????? FROM StudentRecord
?????? WHERE name=’gg’;
?????? 上述游標自動打開,并把相關值賦給對應變量,然后關閉。執行完后,PL/SQL變量curStudentNo,curStudentName中已經有了值。
?? 2、 隱式游標
???? 單條sql語句所產生的結果集合
?????? 用關鍵字SQL表示隱式游標
??????? 4個屬性 %rowcount? 影響的記錄的行數? 整數
??????????????? %found???? 影響到了記錄 true
??????????????? %notfound? 沒有影響到記錄 true
??????????????? %isopen??? 是否打開? 布爾值 永遠是false
???????? 多條sql語句 隱式游標SQL永遠指的是最后一條sql語句的結果
???????? 主要使用在update 和 delete語句上?????
實際操作和例子:
?? (1)FOR循環游標 (常用的一種游標)
?--<1>定義游標
?--<2>定義游標變量
?--<3>使用for循環來使用這個游標
? --前向游標 只能往一個方向走
? --效率很高
????? declare
??????? --類型定義
??????? cursor cc is select empno,ename,job,sal
???????? from emp where job = 'MANAGER';
??????? --定義一個游標變量
??????? ccrec cc%rowtype;
????? begin
???????? --for循環
???????? for ccrec in cc loop
??????????? dbms_output.put_line(ccrec.empno||'-'||ccrec.ename||'-'||ccrec.job||'-'||ccrec.sal);
???????? end loop;???????
????? end;
?? (2) fetch游標
???? --使用的時候 必須要明確的打開和關閉
????? declare
??????? --類型定義
??????? cursor cc is select empno,ename,job,sal
???????? from emp where job = 'MANAGER';
??????? --定義一個游標變量
??????? ccrec cc%rowtype;
????? begin
??????? --打開游標
???????? open cc;
??????? --loop循環
???????? loop
??????????? --提取一行數據到ccrec中
??????????? fetch cc into ccrec;????????
??????????? --判斷是否提取到值,沒取到值就退出
??????????? --取到值cc%notfound 是false
??????????? --取不到值cc%notfound 是true
??????????? exit when cc%notfound;
??????????? dbms_output.put_line(ccrec.empno||'-'||ccrec.ename||'-'||ccrec.job||'-'||ccrec.sal);????????????
???????? end loop;?
??????? --關閉游標
???????? close cc;??
????? end;
? 游標的屬性4種
?????? %notfound? fetch是否提到數據 沒有true 提到false
?????? %found????? fetch是否提到數據 有true 沒提到false
?????? %rowcount? 已經取出的記錄的條數
?????? %isopen??? 布爾值 游標是否打開
?? (3)參數游標
?按部門編號的順序輸出部門經理的名字
???? declare
?????? --部門
?????? cursor c1 is select deptno from dept;
?????? --參數游標c2,定義參數的時候
?????? --只能指定類型,不能指定長度?
?????? --參數只能出現在select語句=號的右側
?????? cursor c2(no number,pjob varchar2) is select emp.* from emp
???????? where deptno = no and job=pjob;
?????? c1rec c1%rowtype;
?????? c2rec c2%rowtype;
?????? --定義變量的時候要指定長度
?????? v_job varchar2(20);
???? begin
?????? --部門
??????? for c1rec in c1 loop
????????? --參數在游標中使用
????????? for c2rec in c2(c1rec.deptno,'MANAGER') loop
??????????? dbms_output.put_line(c1rec.deptno||'-'||c2rec.ename);
????????? end loop;
??????? end loop;
???? end;?
? (4)引用游標/動態游標
???????-- select語句是動態的
???? declare
?????? --定義一個類型(ref cursor)弱類型???
?????? type cur is ref cursor;
???????? --強類型(返回的結果集有要求)
?????? type cur1 is ref cursor return emp%rowtype;
?????? --定義一個ref cursor類型的變量??
?????? cura cur;
?????? c1rec emp%rowtype;
?????? c2rec dept%rowtype;
???? begin
? DBMS_output.put_line('輸出員工')?? ;??????
?????? open cura for select * from emp;
?????? loop
???????? fetch cura into c1rec;??
???????? exit when cura%notfound;
???????? DBMS_output.put_line(c1rec.ename)?? ;
?????? end loop ;
? DBMS_output.put_line('輸出部門')?? ;
?????? open cura for select * from dept;
?????? loop
???????? fetch cura into c2rec;??
???????? exit when cura%notfound;
???????? DBMS_output.put_line(c2rec.dname)?? ;
?????? end loop;?
?????? close cura;
??? end;
?
轉載于:https://www.cnblogs.com/michael90/articles/4235999.html
總結
以上是生活随笔為你收集整理的游标操作 for Oracle的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js定时器和linux命令locate
- 下一篇: hdu 1505 City Game