首頁  >  文章  >  資料庫  >  什麼是oracle遊標

什麼是oracle遊標

青灯夜游
青灯夜游原創
2022-02-23 11:35:0413285瀏覽

在Oracle中,遊標是一種機制,是透過關鍵字CURSOR的來定義一組Oracle查詢出來的資料集,可以把查詢的資料集儲存在記憶體當中,然後透過遊標指向其中一條記錄,透過循環遊標達到循環資料集的目的。

什麼是oracle遊標

本教學操作環境:Windows7系統、Oracle 11g版、Dell G3電腦。

在Oracle中,遊標(Cursors)是一種機制,可以透過該機制將名稱指派給SELECT語句並處理該SQL語句中的資訊。

Oracle遊標是透過關鍵字CURSOR的來定義一組Oracle查詢出來的資料集,類似數組一樣,把查詢的資料集儲存在記憶體當中,然後透過遊標指向其中一筆記錄,透過循環遊標達到循環資料集的目的。

遊標有什麼作用?

①指定結果集中特定行的位置。

②基於目前的結果集位置檢索一行或連續的幾行。

③在結果集的目前位置修改行中的資料。

④對其他使用者所做的資料變更定義不同的敏感度等級。

⑤可以以程式設計的方式存取資料庫。

Oracle遊標的型別?

1、靜態遊標:結果集已經確實(靜態定義)的遊標。分為隱式和顯示遊標

  • 隱式遊標:所有DML語句為隱式遊標,透過隱式遊標屬性可以取得SQL語句資訊。

  • 顯示遊標:使用者顯示宣告的遊標,即指定結果集。當查詢傳回結果超過一行時,就需要一個明確遊標。

2、REF遊標:動態關聯結果集的暫存物件。

Oracle遊標的狀態有哪些,怎麼使用遊標屬性?

 ①遊標的狀態是透過屬性來表示。

  •   %Found :Fetch語句(取得記錄)執行情況True or False。

  •   %NotFound : 最後一筆記錄是否提取出True or False。

  •   %ISOpen : 遊標是否開啟True or False。

  •   %RowCount :遊標目前提取的行數 。

 ②使用遊標的屬性。

  範例:

/* conn scott/tiger */
  Begin
   Update emp Set  SAL = SAL + 0.1  Where JOB = 'CLERK';
   If  SQL%Found  Then
    DBMS_OUTPUT.PUT_LINE('已经更新!');
   Else
    DBMS_OUTPUT.PUT_LINE('更新失败!');
   End  If;
  End;

如何使用顯示遊標,?如何遍歷循環遊標?

1、使用顯示遊標

  • 聲明遊標:分割儲存區域,注意此時並沒有執行Select 語句。

CURSOR 游标名( 参数 列表)   [返回值类型]   IS   Select 语句;
  • 開啟遊標:執行Select 語句,取得結果集儲存到遊標中,此時遊標指向結果集頭, 而不是第一筆記錄。

 Open 游标名( 参数 列表);
  • 取得記錄:移動遊標取一筆記錄

Fetch  游标名InTo  临时记录或属性类型变量;
  • 關閉遊標:將遊標放入緩衝池中,沒有完全釋放資源。可重新打開。

Close  游标名;

2、遍歷循環遊標

  • For 循環遊標

   循環遊標隱含開啟遊標,自動捲動取得一筆記錄,並自動建立臨時記錄類型變數儲存記錄。處理完後自動關閉遊標。

     For  变量名  In  游标名 
     Loop
      数据处理语句;
     End Loop;
  • Loop循環遊標

     。。。
    Loop
     Fatch  游标名InTo  临时记录或属性类型变量;
     Exit  When   游标名%NotFound;
    End   Loop;
     。。。

  範例1:

/* conn scott/tiger */
   Declare
     Cursor myCur is select empno,ename,sal from emp;
     vna varchar2(10);
     vno number(4);
     vsal number(7,2);
  Begin
     open myCur;
     fetch myCur into vno,vna,vsal;
     dbms_output.put_line(vno||'    '||vna||'    '||vsal);
     close myCur;
  End;
  /

 範例2:使用loop遍歷遊標。

 /* conn scott/tiger */
  Declare
     Cursor myCur is select ename,job,sal,empno from emp;
     varE myCur%rowType;
  Begin
     if myCur%isopen = false then
        open myCur;
       dbms_output.put_line('Opening...');
     end if;
     loop
        fetch myCur into varE;
        exit when myCur%notfound;
        dbms_output.put_line(myCur%rowCount||'    '||vare.empno||'    '||vare.ename||'    '||vare.sal);
     end loop;
     if myCur%isopen then
        Close myCur;
        dbms_output.put_line('Closing...');
     end if;
  End;
  /

  範例3:使用For迴圈遍歷遊標,

  /* conn scott/tiger */
  Declare
     Cursor myCur is select * from emp;
  Begin
     for varA in myCur
      loop
         dbms_output.put_line(myCur%rowCount||'    '||varA.empno||'    '||varA.ename||'  '||varA.sal);
      end loop;
  End;
  /

怎麼更新和刪除顯示遊標中的記錄?

 ①UPDATE或DELETE語句中的WHERE CURRENT OF子字串專門處理要執行UPDATE或DELETE操作的表中取出的最近的資料。

  要使用這個方法,在宣告遊標時必須使用FOR UPDATE子字串,當對話使用FOR UPDATE子字串開啟一個遊標時,

  所有回傳集中的資料行都會處於行等級(ROW-LEVEL)獨佔式鎖定,其他物件只能查詢這些資料行,

  不能進行UPDATE、DELETE或SELECT...FOR UPDATE運算。

   在多表查詢中,使用OF子句來鎖定特定的表,如果忽略了OF子句,那麼所有表中選擇的資料行都將被鎖定。

   如果這些資料行已經被其他會話鎖定,那麼正常情況下ORACLE會等待,直到資料行解鎖。

 ②使用更新或刪除:

  ⑴宣告更新或刪除顯示遊標:

   Cursor 游标名IS  SELECT 语句   For Update [ Of  更新列列名];
   Cursor 游标名IS  SELECT 语句   For Delete [ Of  更新列列名];

  ⑵使用顯示遊標目前記錄來更新或刪除:

   Update  表名   SET   更新语句  Where   Current  Of   游标名;
   Delete  From  表名   Where   Current  Of   游标名;

   範例1:更新顯示遊標記錄

   /*conn scott/tiger*/
   Declare
     Cursor myCur is select job from emp for update;
       vjob empa.job%type;
       rsal empa.sal%type;
    Begin
       open myCur;
       loop
          fetch myCur into vjob;
          exit when myCur%notFound;
          case  (vjob)
             when 'ANALYST' then  rsal := 0.1;
            when  'CLERK' then  rsal := 0.2;
             when  'MANAGER' then  rsal := 0.3;
             else
               rsal := 0.5;
          end case;
        update emp set sal = sal + rsal where current of myCur;
       end loop;
    End;
    /

    範例2:刪除顯示遊標記錄

    /*conn scott/tiger
    Crate table  empa  Select * from scott.emp;
    */
    Declare
      Cursor MyCursor  Select   JOB  From  empa  For  Update;
      vSal   emp.Sal%TYPE;
    Begin
      Loop
       Fetch  MyCursor  InTo  vSal;
       Exit  When  MyCursor%NotFound;
       If   vSal < 800 Then
        Delete  From empa  Where  Cursor  Of   MyCursor;
       End  If;  
      End    Loop;
    End;/

什麼是帶參數的顯示遊標?

1、與過程和函數相似,可以將參數傳遞給遊標並在查詢中使用。

  參數只定義資料類型,沒有大小(所有Oracle中的形參只定義資料類型,不指定大小)。

  与过程不同的是,游标只能接受传递的值,而不能返回值。

   可以给参数设定一个缺省值,当没有参数值传递给游标时,就使用缺省值。

  游标中定义的参数只是一个占位符,在别处引用该参数不一定可靠。

2、使用带参数的显示游标

  • 声明带参数的显示游标:

   CURSOR 游标名  [(parameter[,parameter],...)]    IS   Select语句;

参数形式:

1,参数名   数据类型  

2,参数名   数据类型  DEFAULT  默认值

   例子:

    /*conn scott/tiger
    Crate table  empa  Select * from scott.emp;
    */
    Declare
      Cursor MyCursor(pSal  Number  Default   800)  Select   JOB  From  empa Where  SAL >  pSal ;
      varA  MyCursor%ROWTYPE;
    Begin
      Loop
       Fetch  MyCursor  InTo  varA;
       Exit  When  MyCursor%NotFound;
       DBMS_OUTPUT.PUT_LINE(MyCursor%RowCount||&#39;    &#39;||varA.empno||&#39;    &#39;||varA.ename||&#39;  &#39;||varA.sal); 
      End    Loop;
    End;/

推荐教程:《Oracle教程

以上是什麼是oracle遊標的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn