PL/SQL用游標查詢多條記錄

來源:互聯網
上載者:User
PL/SQL游標為程式提供了從資料庫中選擇多行資料,然後對每行資料單獨進行處理的方法,它為Oracle提供了一種指示和控制SQL處理的各個階段的方法。我將認為您已經對PL/SQL有一定的瞭解。通過本文,您將學會:
游標的建立 游標的處理 定義和使用游標屬性 一、 什麼是游標
Oracle使用兩種游標:顯式游標和隱式游標。不管語句返回多少條紀錄,PL/SQL為使用的每一條UPDATE、DELETE和INSERT等SQL命令隱式的聲明一個游標。(要管理SQL語句的處理,必須隱式的給它定義一個游標。)使用者聲明並使用顯示光線標處理SELECT語句返回的多條記錄。顯示的定義游標一種結構,它使使用者能夠為特定的語句指定記憶體地區,以便以後使用。

二、 游標的作用
當PL/SQL游標查詢返回多行資料時,這些記錄組被稱為活動集。Oracle將這種活動集儲存在您建立的顯示定義的已命名的游標中。Oracle游標是一種用於輕鬆的處理多行資料的機制,沒有游標,Oracle開發人員必須單獨地、顯式地取回並管理游標查詢選擇的每一條記錄。
游標的另一項功能事,它包含一個跟蹤當前訪問的記錄的指標,這使您的程式能夠一次處理多條記錄。

三、 使用顯示光線標的基本方法
步驟如下:
聲明游標 開啟游標 從游標中取回資料 關閉游標 1、聲明游標
聲明游標的文法如下:
DECLARE cursor_name
Is
SELECT statement
其中,cursor_name是您給游標指定的名稱;SELECT statement是給游標活動集返回記錄的查詢。
聲明游標完成了下面兩個目的:
給游標命名;
將一個查詢與游標關聯起來。
值得注意的是,必須在PL/SQL塊的聲明部分聲明游標;給游標指定的名稱是一個未聲明的標識符,而不是一個PL/SQL變數,不能給游標名稱賦值,也不能將它用在運算式中。PL/SQL塊使用這個名稱來引用游標查詢。
例:DECLARE
CURSOR c1
Is
SELECT VIEW_NAME FROM ALL_VIEWS
WHERE ROWNUM<=10;
另外還可以在游標定義語句中聲明游標的參數,例:
CURSOR c1(view _nbr number)
Is
SELECT VIEW_NAME FROM ALL_VIEWS
WHERE ROWNUM<= view _nbr;
游標參數只對相應的游標是可見的,不能在游標範圍之外引用該游標的參數。如果試圖這樣做,Oracle將返回一個錯誤,指出該變數沒有定義。
2、開啟游標
開啟游標的文法如下:
OPEN cursor_name;
其中cursor_name是您以前定義的游標名稱。
開啟游標將啟用查詢並識別活動集,可是在執行游標取回命令之前,並沒有真正取回記錄。OPEN命令還初始化了游標指標,使其指向活動集的第一條記錄。游標被開啟後,直到關閉之前,取回到活動集的所有資料都是靜態,換句話說,游標忽略所有在游標開啟之後,對資料執行的SQL DML命令(INSERT、UPDATE、DELETE和SELECT)。因此只有在需要時才開啟它,要重新整理活動集,只需關閉並重新開啟游標即可。
3、從游標中取回資料
FETCH命令以每次一條記錄的方式取回活動集中的記錄。通常將FETCH命令和某種迭代處理結合起來使用,在迭代處理中,FETCH命令每執行一次,游標前進到活動集的下一條記錄。
FETCH命令的文法:
FETCH cursor_name INTO record_list;
其中,cursor_name是前面定義的游標的名稱;record_list是變數列表,它接受活動集中的列。FETCH命令將活動集的結果放置到這些變數中。
執行FETCH命令後,活動集中的結果被取回到PL/SQL變數中,以便在PL/SQL塊中使用。每取回一條記錄,游標的指標就移向活動集的下一條記錄。
例:
FETCH C1 INTO VNAME;
WHILE C1%FOUND LOOP
DBMS_OUTPUT.PUT_LINE(TO_CHAR(C1%ROWCOUNT)||' '||VNAME);
END LOOP;
其中,使用屬性'%FOUND'使得當FETCH到達活動集的結尾時,不會引發異常。其它屬性及含義見下表:
屬性 含量
%FOUND 布爾型屬性,當最近一次該記錄時成功返回,則值為TRUE
%NOTFOUND 布爾型屬性,它的值總與%FOUND屬性的值相反
%ISOPEN 布爾型屬性,當游標是開啟時返回TRUE
%ROWCOUNT 數字型屬性,返回已從游標中讀取的記錄數

屬性含量%FOUND布爾型屬性,當最近一次該記錄時成功返回,則值為TRUE%NOTFOUND布爾型屬性,它的值總與%FOUND屬性的值相反%ISOPEN布爾型屬性,當游標是開啟時返回TRUE%ROWCOUNT數字型屬性,返回已從游標中讀取的記錄數
4、關閉游標
CLOSE語句關閉以前開啟的游標,使得活動集不確定。當使用者的程式或會話結束時,Oracle隱式關閉游標。游標被關閉後,就不能對它執行任何操作了,否則將引發異常。
CLOSE語句的文法是:
CLOSE cursor_name;
其中,cursor_name是以前開啟的游標的名稱。
完整的程式碼如下:
DECLARE
CURSOR C1 IS SELECT VIEW_NAME FROM ALL_VIEWS
WHERE ROWNUM<=10
ORDER BY VIEW_NAME;
VNAME VARCHAR2(40);
BEGIN
OPEN C1;
FETCH C1 INTO VNAME;
WHILE C1%FOUND LOOP
DBMS_OUTPUT.PUT_LINE(TO_CHAR(C1%ROWCOUNT)||''||VNAME);
END LOOP;
END;
……CLOSE C1;

四、 小結
游標是一種結構,能夠以一次一條記錄的方式處理多行查詢的結果.為每條DML語句建立隱式游標,而顯式游標是由使用者建立的,以便處理返回多條記錄的查詢。而且,通過消除反覆地分析代碼,游標提高了代碼的處理速度。


相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

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

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