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語句的一部分。
二、隱式遊標
       所有的隱式遊標都被假設爲只返回一條記錄。
       使用隱式遊標時,用戶無需進行聲明、打開及關閉。PL/SQL隱含地打開、處理,然後關掉遊標。



實際操作和例子:

   (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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章