1. 程式人生 > 實用技巧 >Oracle遊標簡介與使用

Oracle遊標簡介與使用

簡介

遊標是一個指向查詢結果集的指標,PL/SQL有兩種遊標,分別是顯式遊標和隱式遊標。

隱式遊標

當Oracle執行SELECT INTOINSERTUPDATEDELETESQL語句時,它會自動的建立一個隱式遊標,Oracle內部管理整個隱式遊標的整個執行週期,並且只暴漏出遊標的資訊和狀態,例如:SQL%ROWCOUNTSQL%ISOPENSQL%FOUNDSQL%NOTFOUND。當查詢返回零行或多行時,隱式遊標不夠優雅,這會分別導致NO_DATA_FOUNDTOO_MANY_ROWS異常。

顯示遊標

顯式遊標是在當前塊或包規範的宣告部位中顯式宣告的SELECT語句。你可以控制顯式遊標的整個執行週期從OPEN

FETCHCLOSE。Oracle定義了一個執行週期來執行SQL語句並將遊標與之關聯。

1.宣告一個遊標

在使用顯式遊標之前,你必須宣告它。

CURSOR cursor_name IS query

上句中,首先在CURSOR關鍵字之後指定了遊標的名字,然後在IS關鍵字後定義了一個獲取資料的查詢。

2.開啟遊標

在開始從遊標中獲取行之前,你必須先開啟遊標,你可以使用下面的語法來開啟遊標。

OPEN cursor_name

在這句話中,cursor_name是在宣告部分所宣告遊標的名字。

當你開啟遊標,Oracle會解析查詢,繫結變數並且執行所關聯的SQL語句。Oracle也決定了執行計劃,將變數和遊標引數與SQL語句中的佔位符相關聯,確定結果集,並將遊標設定到結果集中的第一行。

3.從遊標中獲取資料

FETCH將遊標所指向的當前行放置到變數中,語法如下

FETCH cursor_name INTO variable_list

為了獲取結果集中的所有行,你必須使用FETCH獲取每一行直至最後一行。

4.關閉遊標

在獲取到所有行之後,你必須使用CLOSE語句關閉遊標。

CLOSE cursor_name

關閉遊標會使Oracle在適當的時機釋放所佔用的記憶體。

如果你在匿名塊、儲存過程或者函式中宣告遊標,在這些物件執行結束時遊標也會自動的關閉。

5.顯示遊標的屬性

一個遊標有四個屬性,你可以使用以下語法來引用他們

cursor_name%attrribute

cursor_name

是顯式遊標的名稱

%ISOPEN

如果遊標打開了,該屬性就為TRUE否則為FALSE

%FOUND

這個屬性有四個值

  • NULL:在第一次獲取資料之前

  • TRUE:一條記錄成功的被獲取到

  • FALSE:沒有記錄返回

  • INVALID_CURSOR:遊標沒有開啟

%NOTFOUND

這個屬性也有四個值

  • NULL:在第一次獲取資料之前

  • FALSE:一條記錄成功的被獲取到

  • TRUE:沒有記錄返回

  • INVALID_CURSOR:遊標沒有開啟

%ROWCOUNT

該屬性反悔了從遊標中獲取的記錄數,若遊標未開啟,則該屬性返回INVALID_CURSOR

示例

declare 
       --型別定義
       cursor c_job
       is
       select empno,ename,job,sal
       from emp
       where job='MANAGER';
       --定義一個遊標變數
       c_row c_job%rowtype;
begin
       open c_job;
         loop
           --提取一行資料到c_row
           fetch c_job into c_row;
           --判讀是否提取到值,沒取到值就退出
           --取到值c_job%notfound 是false 
           --取不到值c_job%notfound 是true
           exit when c_job%notfound;
            dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
         end loop;
       --關閉遊標
      close c_job;
end;