首頁 資料庫 Oracle 什麼是oracle遊標

什麼是oracle遊標

Feb 23, 2022 am 11:35 AM
oracle 遊標

在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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

oracle如何查表空間大小 oracle如何查表空間大小 Apr 11, 2025 pm 08:15 PM

要查詢 Oracle 表空間大小,請遵循以下步驟:確定表空間名稱,方法是運行查詢:SELECT tablespace_name FROM dba_tablespaces;查詢表空間大小,方法是運行查詢:SELECT sum(bytes) AS total_size, sum(bytes_free) AS available_space, sum(bytes) - sum(bytes_free) AS used_space FROM dba_data_files WHERE tablespace_

oracle如何查看實例名 oracle如何查看實例名 Apr 11, 2025 pm 08:18 PM

在 Oracle 中查看實例名的方法有三種:命令行中使用 "sqlplus" 和 "select instance_name from v$instance;" 命令。在 SQL*Plus 中使用 "show instance_name;" 命令。通過操作系統的任務管理器、Oracle Enterprise Manager 或檢查環境變量 (Linux 上的 ORACLE_SID)。

oracle視圖如何加密 oracle視圖如何加密 Apr 11, 2025 pm 08:30 PM

Oracle 視圖加密允許您加密視圖中的數據,從而增強敏感信息安全性。步驟包括:1) 創建主加密密鑰 (MEk);2) 創建加密視圖,指定要加密的視圖和 MEk;3) 授權用戶訪問加密視圖。加密視圖工作原理:當用戶查詢加密視圖時,Oracle 使用 MEk 解密數據,確保只有授權用戶可以訪問可讀數據。

oracle如何獲取時間 oracle如何獲取時間 Apr 11, 2025 pm 08:09 PM

在 Oracle 中獲取時間有以下方法:CURRENT_TIMESTAMP:返回當前系統時間,精確到秒。 SYSTIMESTAMP:比 CURRENT_TIMESTAMP 更準確,精確到納秒。 SYSDATE:返回當前系統日期,不含時間部分。 TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'): 將當前系統日期和時間轉換為特定格式。 EXTRACT:從時間值中提取特定部分,如年份、月份或小時。

Oracle安裝失敗如何卸載 Oracle安裝失敗如何卸載 Apr 11, 2025 pm 08:24 PM

Oracle 安裝失敗的卸載方法:關閉 Oracle 服務,刪除 Oracle 程序文件和註冊表項,卸載 Oracle 環境變量,重新啟動計算機。若卸載失敗,可使用 Oracle 通用卸載工具手動卸載。

oracle數據庫如何導入 oracle數據庫如何導入 Apr 11, 2025 pm 08:06 PM

數據導入方法:1. 使用 SQLLoader 實用程序:準備數據文件、創建控製文件、運行 SQLLoader;2. 使用 IMP/EXP 工具:導出數據、導入數據。提示:1. 大數據集推薦 SQL*Loader;2. 目標表應存在,列定義匹配;3. 導入後需驗證數據完整性。

oracle如何設置用戶 oracle如何設置用戶 Apr 11, 2025 pm 08:21 PM

在 Oracle 中創建用戶需遵循以下步驟:使用 CREATE USER 語句創建新用戶。使用 GRANT 語句授予必要權限。可選:使用 RESOURCE 語句設置配額。配置其他選項,如默認角色和臨時表空間。

oracle無效數字如何排查 oracle無效數字如何排查 Apr 11, 2025 pm 08:27 PM

Oracle 無效數字錯誤可能由數據類型不匹配、數字溢出、數據轉換錯誤或數據損壞引起。排查步驟包括檢查數據類型、檢測數字溢出、檢查數據轉換、排查數據損壞,並探索其他可能的解決方案,如配置 NLS_NUMERIC_CHARACTERS 參數和啟用數據驗證日誌記錄。

See all articles