Oracle游標簡介與使用


簡介

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

隱式游標

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

顯示游標

顯式游標是在當前塊或包規范的聲明部位中顯式聲明的SELECT語句。你可以控制顯式游標的整個執行周期從OPENFETCHCLOSE。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;

 

參考:https://www.oracletutorial.com/plsql-tutorial/plsql-cursor/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM