Oracle中cursor(遊標)總結

1.       遊標: 容器,存儲SQL語句影響行數。

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

2.       遊標類型: 隱式遊標,顯示遊標,REF遊標。其中,隱式遊標和顯示遊標屬於靜態遊標(運行前將遊標與SQL語句關聯),REF遊標屬於動態遊標(運行時將遊標與SQL語句關聯)

 

3.       隱式遊標: DML語句對應的遊標,由Oracle自動管理,也稱SQL遊標。

 

q      隱式遊標的屬性有:

q      %FOUND – SQL 語句影響了一行或多行時爲 TRUE

q      %NOTFOUND – SQL 語句沒有影響任何行時爲TRUE

q      %ROWCOUNT – SQL 語句影響的行數

q      %ISOPEN  - 遊標是否打開,始終爲FALSE

 

 

  舉例說明:

 

  declare

  v_empno emp.empno %type:=7000;

  begin

   update emp set ename='fxe' where empno=v_empno;

   if SQl%found then

      dbms_output.put_line(SQL%rowcount||'Delete Ok!');

   end if;

   if SQL%notfound then

      dbms_output.put_line('僱員編號'||v_empno||'不存在');

   end if;

end;

 

--------------------執行結果如下--------------------------

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4.  顯示遊標操作: 

                  (1)聲明遊標(關聯SQL語句)    cursor+遊標名 is/as sql語句

                  (2)打開遊標(執行SQL語句,填充遊標)    open+遊標名

                  (3)提取遊標的行    fetch  遊標名 into 行類型變量

                  (4)關閉遊標       close+遊標名

 

舉例說明:

 

declare

  cursor emp_cur is select * from emp;

  empRecord emp%rowtype;

begin

  open emp_cur;

  loop

    fetch emp_cur into empRecord;

    exit when emp_cur%notfound;

    dbms_output.put_line(empRecord.ename);

  end loop;

  close emp_cur;

end;

 

-----------------------------------執行結果如下圖--------------------------------------------------------

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5帶參數的顯示遊標

 : 

 

 declare

  destination varchar2(20);

  cursor emp_cur(dest varchar2)

   is select * from emp where empno=dest;

  empRecord emp%rowtype;

begin

  destination:=&empno;

  open emp_cur(destination);

  loop

  fetch emp_cur into empRecord;

  exit when emp_cur%notfound;

  dbms_output.put_line(empRecord.ename);

  end loop;

  close emp_cur;

end;

 

 

----輸入參數:7369

-----------------------------------------執行結果--------------------------------------------------

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6.使用顯示遊標更新行

q      允許使用遊標刪除或更新活動集中的行

q      聲明遊標時必須使用 SELECT … FOR UPDATE語句

 

例:

declare

   old_sal number(4);

   emp_name varchar2(20);

   cursor emp_cur is select ename,sal from emp

                     where sal<1000

                     for update of sal;

begin

   open emp_cur;

   loop

     fetch emp_cur into emp_name,old_sal;

     exit when emp_cur%notfound;

     update emp set sal=1.1*old_sal

     where current of emp_cur;

     dbms_output.put_line('更新成功!');

   end loop;

end;

--------------------------執行結果---------------------------------------

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

7.循環遊標

q     循環遊標用於簡化遊標處理代碼

q     當用戶需要從遊標中提取所有記錄時使用

q     循環遊標的語法如下:

 

     FOR <record_index> IN <cursor_name>

<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />LOOP

       <executable statements>

END LOOP;

 

:

  declare

  cursor emp_cur is select empno,ename,sal from emp;

begin

 

  for empRecord in emp_cur

  loop

    dbms_output.put_line(empRecord.empno

    ||empRecord.ename||empRecord.sal);

  end loop;

end;

 

--------------------執行結果--------------------------------

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

8.REF遊標和遊標變量

q      REF 遊標和遊標變量用於處理運行時動態執行的 SQL 查詢

q      創建遊標變量需要兩個步驟:

q      聲明 REF 遊標類型

q      聲明 REF 遊標類型的變量

q      用於聲明 REF 遊標類型的語法爲:

 

       TYPE <ref_cursor_name> IS REF CURSOR

       [RETURN <return_type>];

q      打開遊標變量的語法如下:

        OPEN cursor_name FOR select_statement;

 

聲明強類型的REF遊標

 type  emp_cur is ref cursor return emp%rowtype;

 empRecord  emp_cur;

 

聲明弱類型的REF遊標

 type  emp_cur is ref cursor;

 empRecord  emp_cur;

 

 

: 

  DECLARE

    TYPE emp_cur IS REF CURSOR

          RETURN emp%ROWTYPE;

     empObj emp_cur;

    empRecord emp%ROWTYPE;

     BEGIN

    OPEN empObj FOR

      SELECT * FROM emp;

    loop

    FETCH empObj INTO empRecord;

    exit when empObj%notfound;

    dbms_output.put_line(empRecord.ename);

    end loop;

    CLOSE empObj;

     END;

--------------------------------------執行結果---------------------------------------

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

9.遊標變量的優點和限制

 

q         遊標變量的功能強大,可以簡化數據處理。

q      遊標變量的優點有:

q      可從不同的 SELECT 語句中提取結果集

q      可以作爲過程的參數進行傳遞

q      可以進行賦值運算

q      使用遊標變量的限制:

q      不能在程序包中聲明遊標變量

q      FOR UPDATE子句不能與遊標變量一起使用

q      不能使用比較運算符

 

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