天天看點

資料庫之遊标

  以前也接觸過遊标,但是打心裡說不是太了解,通過這次學習感覺了解深刻了很多,特此總結學習一下。

         一,遊标是什麼?

                 遊标是一段私有的SQL工作區,也就是一段記憶體區域,用于暫時存放受SQL語句影響到的資料。通俗了解就是将受影響的資料暫時放到了一個記憶體區域的虛表中,而這個虛表就是遊标。

        二,作用是什麼?

                  1,大家都知道資料庫中的事物可以復原,而遊标在其中起着非常重要的作用,由于對資料庫的操作我們會暫時放在遊标中,隻要不送出,我們就可以根據遊标中内容進行復原,在一定意義有利于資料庫的安全。

                 2,另外,在Oracle中PL/SQL隻能傳回單行資料,而遊标彌補了這個不足。相當于ADO.NET中的Data table吧。

         三,類型:

                1,隐式遊标:增删改等操作Oracle都會自動建立遊标,暫時儲存操作結果,也就是能夠復原的操作都會引發遊标的建立。

                2,顯示遊标:由開發人員通過程式顯式控制,用于從表中取出多行資料,并将多行資料一行一行的單獨進行處理.

         四,屬性:

屬性 注釋
%rowcount   受SQL影響的行數
%found  Boolean值,是否還有資料
%notfound Boolean值,是否已無資料
%isopen 遊标是否打開

    當然如果我們想獲得隐式遊标的屬性,通過%前邊加上SQL即可得到。例如SQL%rowcount.

        五,遊标簡單認識了,我們來看看遊标的具體使用:

           1,先看一下簡單的使用遊标四步驟:

步驟 關鍵詞 說明
1 在DECLARE中cursor 聲明遊标,建立一個命名的查詢語句
2 Open 打開遊标
3 Fetch 取出遊标中的一條記錄裝入變量
4 Close 釋放遊标

          2,當然遊标中可以存放一條資料,也可以存放多條資料,後者是我們用遊标,前者我們通過PL/SQL語句即可完成的,這樣我們在這裡就必須用到循環結構了,在Oracle資料庫中我們可以使用while…… loop……end loop , for…… loop……end loop,loop……end loop。在這裡需要提出的是,for循環結構在Oracle中被簡化了,我們隻需要聲明和使用即可。看下邊這個例子吧:

         a,whlie循環結構的:

[sql] view plain copy

  1. declare  
  2.   --定義記錄類型的變量  
  3.   v_user user%rowtype;  
  4.   --1,利用cursor關鍵字聲明遊标  
  5.   cursor user_cur is  
  6.     select * from user;  
  7. begin  
  8.   --2,打開遊标  
  9.   open user_cur;  
  10.   --3,利用fetch讀取資料  
  11.   fetch user_cur  
  12.     into v_user;  
  13.   while user_cur%found loop  
  14.     dbms_output.put_line(v_user.userName);  
  15.     fetch user_cur  
  16.       into v_user;  
  17.   end loop;  
  18.   --4,釋放遊标  
  19.   close user_cur;  
  20. end;  

        b,簡化的for結構循環:

[sql] view plain copy

  1. declare  
  2.   --1,利用cursor關鍵字聲明遊标  
  3.   cursor user_cur is  
  4.     select * from user;  
  5. begin  
  6.   --2,直接使用,Oracle會自動打開和關閉等操作。  
  7.    for v_user in user_cur loop  
  8.        dbms_output.put_line(v_user.userName);  
  9.     end loop  
  10. end;  

   這裡就介紹這兩種的類型,loop的和這都差不多。

          3,最後在這裡再學習一下帶參數的遊标,也是就和我們但參數的類是一樣的,隻不過一個用在了資料庫中,一個用在了程式設計語言中。

[sql] view plain copy

  1. declare  
  2.   --定義記錄類型的變量  
  3.   v_User user%rowtype;  
  4.   --1,利用cursor關鍵字聲明帶參數的遊标  
  5.   cursor user_Cur(v_UserNo number) is  
  6.     select * from user where  userNo=v_UserNo;  
  7. begin  
  8.   --2,打開帶參數的遊标,使之更加靈活 。  
  9.   open user_Cur(1012);  
  10.   --3,利用fetch讀取資料  
  11.   loop  
  12.        fetch user_Cur into v_User;  
  13.        exit when user_Cur%notfound;  
  14.        dbms_output.put_line(v_user.userName);  
  15.   end loop;  
  16.   --4,釋放遊标  
  17.   close user_Cur;  
  18. end;  

          綜上為遊标的簡單學習,回想過去的學習,可以發現遊标可以和datatable很相似,為了增加靈活性,它和類也有非常相似的功能。是以米老師曾經告訴我們的語言是相通的,每一種事也是相同的。就例如,JAVA和.NET開發,SQL Server和Oracle一樣,學通了一門,其它的轉向都是非常快的。