資料庫操作之遊標

忘塵天外天發表於2017-08-15

  遊標在運算元據庫時經常用到的。它使用相對靈活。遊標--資料的緩衝區。遊標的使用可以讓使用者像運算元組一樣操作查詢出來的資料集,這使得使用PL/SQL更加方便。實際上,它提供了一種從集合性質的結果中提取單條記錄的手段。

  遊標的概念

  可以將遊標(Cursor)形象地看做成一個變動的游標。它實際上是一個指標,它在一段Oracle存放資料查詢結果集或資料操作結果集的記憶體中,這個指標可以指向結果集中的任何一條記錄 。這樣就可以得到它所指向的資料了,但初始時它指向首記錄。這種模型很像程式語言中的陣列。

  可以簡單的理解遊標為指向結果集記錄的指標,利用遊標可以把返回它當前指向 的行記錄(只能返回一行記錄)。如果要返回多行,那麼需要不斷滾動遊標,把想要的資料查詢一遍。使用者可以操作遊標所在位置行的記錄。

  遊標的種類

  Oracle中游標分為靜態遊標和REF遊標。其中,靜態遊標就像一個資料快照,開啟遊標後的結果集是對資料庫資料的一個備份,資料不隨著對錶執行DML操作而改變。從這個特性來說,結果集是靜態的。

  靜態遊標包含如下兩種型別:

  顯式遊標:是指在使用前必須有著明確的遊標宣告和定義,這樣的遊標定義會關聯資料查詢語句,通常會返回一行或多行。開啟遊標後,使用者可以利用遊標的位置對結果集進行檢索,使之返回單一的行記錄,使用者可以操作次記錄。關閉遊標後,就不能再對結果集進行任何操作。顯式遊標需要使用者自己寫程式碼完成,一切由使用者控制。

  隱式遊標:和顯式遊標不同,它被PL/SQL自動管理,也被稱為PL/SQL遊標。由Oracle自動管理。該遊標使用者無法控制,但能得到它的屬性資訊。

  顯式遊標

  顯式遊標在PL/SQL程式設計中有著重要的作用,通過顯式遊標使用者可以操作返回的資料,使得一些在程式語言複雜的功能變得更容易實現。遊標的語法:

  CURSOR cursor_name 

    [(parameter_name,dataTYPE,...)]
      IS select_statement ;

語法說明:CURSOR :  宣告遊標關鍵字;cursor_name: 遊標的名字 ;

     parameter_name: 引數名稱;dataTYPE:  引數型別;

  select_statement :遊標關聯的SELECT語句,但該語句不能是SELECT....INTO ...語句

  遊標使用步驟

  顯式遊標的使用順序可以明確的分成宣告遊標、開啟遊標、讀取資料和關閉遊標4個步驟。

  (1)宣告遊標

  主要用來給遊標命名並且使得遊標關聯一個查詢。具體語句:

    DECLARE
      CURSOR stunames IS SELECT s.sname FROM student s ;

      stuname  student.sname%TYPE;

  (2)開啟遊標

   遊標 中任何對資料的操作都是建立在遊標被開啟的前提下。開啟遊標初始化了遊標指標,遊標一旦開啟,其結果集都是靜態的。也就是說,結果集此時不會反映出資料庫中對資料進行的增加、刪除和修改操作。語法:

         OPEN stunames ;

  (3)讀取資料

  讀取資料需要使用FETCH語句完成,它可以把遊標執行位置的記錄放到 PL/SQL宣告的變數當中。它只能讀取指標當前行的記錄。正常情況下,FETCH要和迴圈語句一起使用,這樣指標會不斷前進,知道某個條件不符合要求而退出。使用FETCH時遊標屬性%ROWCOUNT會不斷累加。具體用法:

       FETCH stunames INTO stuname ;

  (4)關閉遊標

  關閉某個名稱的遊標。此時釋放資源,結果集中的資料將不能做任何操作。

     CLOSE stunames;

  遊標中的LOOP語句

  通常顯式遊標提取的資料不會是一條記錄,而是多條記錄。這樣就需要一個遍歷結果集的標準方法,而LOOP語句就能實現這樣的功能。

   完整的示例:

          

  使用BULK   COLLECT  和FOR 語句的遊標

  遊標中通常使用FETCH....INTO...語句提取資料,這種方式是單條資料提取,在資料量很大的情況下執行效率不是很理想。而FETCH.....BULK  COLLECT  INTO...語句可以批量提取資料,在資料量很大的情況下它的執行效率比單條提取資料的高。

          

          

  使用CURSOR  FOR  LOOP

  遊標很多機會都是迭代結果集,在PL/SQL這個過程中可以使用更簡單的方式實現,CURSOR   FOR  LOOP不需要特別的宣告變數,它可以提出行物件的資料

           

  顯式遊標的屬性

  利用遊標屬性可以得到遊標執行的相關資訊。顯式遊標由4個屬性:

  • %ISOPEN:用於判斷遊標是否開啟,如果已經開啟則返回TRUE,如果遊標未開啟則返回FALSE。
  • %FOUND:可用來檢測行資料是否有效。如果有效該屬性返回TRUE,否則返回FALSE。
  • %NOTFOUND :與%FOUND屬性恰好相反,如果沒有提取出資料則返回TRUE,否則返回FALSE。
  • %ROWCOUNT:累計到當前為止使用FETCH提取資料的行數。

        

  注意: --dbms_output.put_line()  只能列印數字和字串......

帶引數的遊標

  在使用顯式遊標時可以指定引數,指定的引數可以傳遞給遊標使用,這樣就方便根據不同的查詢條件進行查詢,也方便遊標在儲存過程中使用。

      

相關文章