PL SQL用游標查詢多條記錄

2021-08-21 23:16:02 字數 3072 閱讀 8193

pl/sql游標為程式提供了從資料庫中選擇多行資料,然後對每行資料單獨進行處理的方法,它為oracle提供了一種指示和控制sql處理的各個階段的方法。我將認為您已經對pl/sql有一定的了解。通過本文,您將學會:

一、 什麼是游標

oracle使用兩種游標:顯式游標和隱式游標。不管語句返回多少條紀錄,pl/sql為使用的每一條update、delete和insert等sql命令隱式的宣告乙個游標。(要管理sql語句的處理,必須隱式的給它定義乙個游標。)使用者宣告並使用顯示游標處理select語句返回的多條記錄。顯示的定義游標一種結構,它使使用者能夠為特定的語句指定記憶體區域,以便以後使用。

二、 游標的作用

當pl/sql游標查詢返回多行資料時,這些記錄組被稱為活動集。oracle將這種活動集儲存在您建立的顯示定義的已命名的游標中。oracle游標是一種用於輕鬆的處理多行資料的機制,沒有游標,oracle開發人員必須單獨地、顯式地取回並管理游標查詢選擇的每一條記錄。

游標的另一項功能事,它包含乙個跟蹤當前訪問的記錄的指標,這使您的程式能夠一次處理多條記錄。

三、 使用顯示游標的基本方法

步驟如下:

1、宣告游標

宣告游標的語法如下:

declare cursor_name

isselect statement

其中,cursor_name是您給游標指定的名稱;select statement是給游標活動集返回記錄的查詢。

宣告游標完成了下面兩個目的:

給游標命名;

將乙個查詢與游標關聯起來。

值得注意的是,必須在pl/sql塊的宣告部分宣告游標;給游標指定的名稱是乙個未宣告的識別符號,而不是乙個pl/sql變數,不能給游標名稱賦值,也不能將它用在表示式中。pl/sql塊使用這個名稱來引用游標查詢。

例:declare

cursor c1

isselect view_name from all_views

where rownum<=10;

另外還可以在游標定義語句中宣告游標的引數,例:

cursor c1(view _nbr number)

isselect 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語句建立隱式游標,而顯式游標是由使用者建立的,以便處理返回多條記錄的查詢。而且,通過消除反覆地分析**,游標提高了**的處理速度。

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

一 什麼是游標 oracle 使用兩種游標 顯式游標和隱式游標。不管語句返回多少條紀錄,pl sql 為使用的每一條 update delete 和 insert 等 sql 命令隱式的宣告乙個游標。要管理 sql 語句的處理,必須隱式的給它定義乙個游標。使用者宣告並使用顯示游標處理 select ...

PL SQL 引用游標的使用

使用引用游標的情景 1.你可能有這樣的需求 讓乙個函式返回乙個游標,然後宿主函式呼叫並使用這個游標 2.open cursor name for v sql statement 當時用動態sql進行多行查詢時,因為此處的cursour name必須是乙個游標變數,所以需要使用。h還可檢視例子 cre...

pl sql 使用游標屬性,案例

使用游標 1 顯示游標 cursor name cursor is select statement 2 開啟游標 open name cursor 3 提取游標 fetch name cursor into variable1,variable2.4 關閉游標 close name cursor ...