Oracle 基礎 遊標

來源:互聯網
上載者:User

標籤:

一:遊標的基本原理

  遊標用來處理從資料庫中檢索的多行記錄(使用SELECT語句)。利用遊標,程式可以逐個地處理和遍曆一次檢索返回的整個記錄集。

     為了處理SQL語句,Oracle將在記憶體中分配一個地區,這就是上下文區。這個區包含了已經處理完的行數、指向被分析語句的指標,整個區是查詢語句返回的資料行集。遊標就是指向上下文區控制代碼或指標。

二:遊標的分類

  1.靜態資料指標:在編譯時間知道其SELECT語句的遊標。

    (1).顯示遊標

    (2).隱式遊標

  2.動態資料指標:使用者為遊標使用的查詢直到啟動並執行時候才能確定,必須聲明遊標變數。

    (1):強型別REF遊標

    (2):弱類型REF遊標。

 

三:顯示遊標的用法

  顯示遊標被用於處理返回多行資料的SELECT 語句,遊標名通過CURSOR….IS 語句顯示地賦給SELECT 語句。

  (一):使用步驟

    1)聲明遊標:

      CURSOR cursor_name(遊標名) IS select 語句;

    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語句的一部分。

  例:顯示僱員的名稱和薪水

    方法一:

 

--使用LOOP遍曆遊標DECLARE  v_name emp.ename%TYPE;  v_sal emp.sal%TYPE;  CURSOR cus_emp IS    SELECT ename,sal FROM emp;                         --聲明遊標BEGIN   OPEN cus_emp;                                       --開啟遊標   LOOP       FETCH cus_emp INTO v_name,v_sal;                 --提取遊標      EXIT WHEN cus_emp%NOTFOUND;      dbms_output.put_line(‘第‘||cus_emp%ROWCOUNT||‘個使用者:  name:‘||v_name||‘     sal:‘||v_sal);   END LOOP;   CLOSE cus_emp;                                      --關閉遊標END;

 

    顯示遊標的屬性

    %isopen:遊標是否開啟

    %found:遊標是否指向有效行

    %notfounp:遊標是否沒有指向有效行

    %rowcount:遊標抽取的行數

   文法:遊標名  屬性名稱

    

      方法二:使用遊標簡化遊標的讀取

      For 自訂類型 in 遊標名 loop;

        --操作各行的資料

      end loop;

 

DECLARE
  CURSOR cus_emp IS
    SELECT ename,sal FROM emp;
BEGIN
   FOR record_emp IN cus_emp
   LOOP
      dbms_output.put_line(‘第‘||cus_emp%ROWCOUNT||‘個使用者:  name:‘||record_emp.ename||‘     sal:‘||record_emp.sal);
   END LOOP;
END;

 

 

 

 

 

 

 

四、隱式遊標:

  所有的隱式遊標都被假設為只返回一條記錄。   

  使用隱式遊標時,使用者無需進行聲明、開啟及關閉。PL/SQL隱含地開啟、處理,然後關掉遊標。多條sql語句 隱式遊標SQL永遠指的是最後一條sql語句的結果,主要使用在update 和 delete語句上。

  隱式遊標的四個屬性:

屬性 說明
SQL%rowcount 影響的記錄的行數整數(用來判斷插入,更新修改是否成功,必須在comit之前,否則提交後結果為0.)
SQL%found 影響到了記錄 true()
SQL%notfound 沒有影響到記錄 true
SQL%isopen 是否開啟 布爾值 永遠是false

 

 

 

 

 

例如:

DECLARE  row_emp emp%ROWTYPE;BEGIN  SELECT ename,sal INTO row_emp.ename,row_emp.sal  FROM emp WHERE emp.empno = 7369;  --判斷是否查到資料  if(SQL%ROWCOUNT=1) THEN    dbms_output.put_line(‘找到了‘);  END IF;  --另一種方式判斷  IF(SQL%Found) THEN    dbms_output.put_line(‘找到了‘);  END IF;  dbms_output.put_line(‘ename:‘||row_emp.ename||‘    sal:‘||row_emp.sal);END;

五:動態資料指標

Oracle 基礎 遊標

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.