?? oracle實例-1.htm
字號:
<body bgcolor="#000000">
<p><FONT color="#009900"
class=title>PL/SQL中用光標(biāo)查詢多條記錄</FONT></p>
<p> </p>
<font color="#FFFFFF">
PL/SQL光標(biāo)為程序提供了從數(shù)據(jù)庫中選擇多行數(shù)據(jù),然后對每行數(shù)據(jù)單獨進(jìn)行處理的方法,它為Oracle</A>提供了一種指示和控制SQL處理的各個階段的方法。我將認(rèn)為您已經(jīng)對PL/SQL有一定的了解。通過本文,您將學(xué)會:<BR>
</FONT></font><FONT class=content>
<UL>
<LI><font color="#FFFFFF">光標(biāo)的創(chuàng)建 </font>
<LI><font color="#FFFFFF">光標(biāo)的處理 </font>
<LI><font color="#FFFFFF">定義和使用光標(biāo)屬性 </font></LI>
</UL>
<font color="#FFFFFF"><B>一、 什么是光標(biāo)</B><BR>
b.gifOracle</A>使用兩種光標(biāo):顯式光標(biāo)和隱式光標(biāo)。不管語句返回多少條紀(jì)錄,PL/SQL為使用的每一條UPDATE、DELETE和INSERT等SQL命令隱式的聲明一個光標(biāo)。(要管理SQL語句的處理,必須隱式的給它定義一個光標(biāo)。)用戶聲明并使用顯示光標(biāo)處理SELECT語句返回的多條記錄。顯示的定義光標(biāo)一種結(jié)構(gòu),它使用戶能夠為特定的語句指定內(nèi)存區(qū)域,以便以后使用。<BR>
<BR>
<B>二、 光標(biāo)的作用</B><BR>
當(dāng)PL/SQL光標(biāo)查詢返回多行數(shù)據(jù)時,這些記錄組被稱為活動集。b.gifOracle</A>將這種活動集存儲在您創(chuàng)建的顯示定義的已命名的光標(biāo)中。b.gifOracle</A>光標(biāo)是一種用于輕松的處理多行數(shù)據(jù)的機制,沒有光標(biāo),b.gifOracle</A>開發(fā)人員必須單獨地、顯式地取回并管理光標(biāo)查詢選擇的每一條記錄。<BR>
光標(biāo)的另一項功能事,它包含一個跟蹤當(dāng)前訪問的記錄的指針,這使您的程序能夠一次處理多條記錄。<BR>
<BR>
<B>三、 使用顯示光標(biāo)的基本方法</B><BR>
步驟如下:<BR>
</font>
<UL>
<LI><font color="#FFFFFF">聲明光標(biāo) </font>
<LI><font color="#FFFFFF">打開光標(biāo) </font>
<LI><font color="#FFFFFF">從光標(biāo)中取回數(shù)據(jù) </font>
<LI><font color="#FFFFFF">關(guān)閉光標(biāo) </font></LI>
</UL>
<font color="#FFFFFF"> 1、聲明光標(biāo)<BR>
聲明光標(biāo)的語法如下:<BR>
</font>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width=580
borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#CCCCCC><font color="#000000">DECLARE cursor_name<BR>
Is<BR>
SELECT statement</font></TD>
</TR>
</TBODY>
</TABLE>
<font color="#FFFFFF"><BR>
其中,cursor_name是您給光標(biāo)指定的名稱;SELECT statement是給光標(biāo)活動集返回記錄的查詢。<BR>
聲明光標(biāo)完成了下面兩個目的:<BR>
給光標(biāo)命名;<BR>
將一個查詢與光標(biāo)關(guān)聯(lián)起來。<BR>
值得注意的是,必須在PL/SQL塊的聲明部分聲明光標(biāo);給光標(biāo)指定的名稱是一個未聲明的標(biāo)識符,而不是一個PL/SQL變量,不能給光標(biāo)名稱賦值,也不能將它用在表達(dá)式中。PL/SQL塊使用這個名稱來引用光標(biāo)查詢。<BR>
</font>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width=580
borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#CCCCCC><font color="#000000">例:DECLARE<BR>
CURSOR c1<BR>
Is<BR>
SELECT VIEW_NAME FROM ALL_VIEWS<BR>
WHERE ROWNUM<=10;<BR>
另外還可以在光標(biāo)定義語句中聲明光標(biāo)的參數(shù),例:<BR>
CURSOR c1(view _nbr number)<BR>
Is<BR>
SELECT VIEW_NAME FROM ALL_VIEWS<BR>
WHERE ROWNUM<= view _nbr;</font></TD>
</TR>
</TBODY>
</TABLE>
<font color="#FFFFFF"><BR>
光標(biāo)參數(shù)只對相應(yīng)的光標(biāo)是可見的,不能在光標(biāo)范圍之外引用該光標(biāo)的參數(shù)。如果試圖這樣做,b.gifOracle</A>將返回一個錯誤,指出該變量沒有定義。<BR>
2、打開光標(biāo)<BR>
打開光標(biāo)的語法如下:<BR>
</font>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width=580
borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#CCCCCC><font color="#000000">OPEN cursor_name;</font></TD>
</TR>
</TBODY>
</TABLE>
</FONT>
<p><FONT class=content><font color="#FFFFFF"><BR>
其中cursor_name是您以前定義的光標(biāo)名稱。<BR>
打開光標(biāo)將激活查詢并識別活動集,可是在執(zhí)行光標(biāo)取回命令之前,并沒有真正取回記錄。OPEN命令還初始化了光標(biāo)指針,使其指向活動集的第一條記錄。光標(biāo)被打開后,直到關(guān)閉之前,取回到活動集的所有數(shù)據(jù)都是靜態(tài)的,換句話說,光標(biāo)忽略所有在光標(biāo)打開之后,對數(shù)據(jù)執(zhí)行的SQL
DML命令(INSERT、UPDATE、DELETE和SELECT)。因此只有在需要時才打開它,要刷新活動集,只需關(guān)閉并重新打開光標(biāo)即可。</font></FONT></p>
<p><FONT class=content><font color="#FFFFFF"> 3、從光標(biāo)中取回數(shù)據(jù)<BR>
FETCH命令以每次一條記錄的方式取回活動集中的記錄。通常將FETCH命令和某種迭代處理結(jié)合起來使用,在迭代處理中,F(xiàn)ETCH命令每執(zhí)行一次,光標(biāo)前進(jìn)到活動集的下一條記錄。<BR>
FETCH命令的語法:<BR>
</font> </FONT></p>
<FONT class=content><TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width=580
borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#CCCCCC><font color="#000000">FETCH cursor_name INTO
record_list;</font></TD>
</TR>
</TBODY>
</TABLE>
<font color="#FFFFFF"><BR>
其中,cursor_name是前面定義的光標(biāo)的名稱;record_list是變量列表,它接受活動集中的列。FETCH命令將活動集的結(jié)果放置到這些變量中。<BR>
執(zhí)行FETCH命令后,活動集中的結(jié)果被取回到PL/SQL變量中,以便在PL/SQL塊中使用。每取回一條記錄,光標(biāo)的指針就移向活動集的下一條記錄。<BR>
</font>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width=580
borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#CCCCCC><font color="#000000">例:<BR>
FETCH C1 INTO VNAME;<BR>
WHILE C1%FOUND LOOP<BR>
DBMS_OUTPUT.PUT_LINE(TO_CHAR(C1%ROWCOUNT)||' '||VNAME);<BR>
END LOOP;<BR>
其中,使用屬性'%FOUND'使得當(dāng)FETCH到達(dá)活動集的結(jié)尾時,不會引發(fā)異常。其它屬性及含義見下表:<BR>
屬性 含量<BR>
%FOUND 布爾型屬性,當(dāng)最近一次該記錄時成功返回,則值為TRUE<BR>
%NOTFOUND 布爾型屬性,它的值總與%FOUND屬性的值相反<BR>
%ISOPEN 布爾型屬性,當(dāng)光標(biāo)是打開時返回TRUE<BR>
%ROWCOUNT 數(shù)字型屬性,返回已從光標(biāo)中讀取的記錄數(shù)<BR>
</font></TD>
</TR>
</TBODY>
</TABLE>
<font color="#FFFFFF"><BR>
</font>
<TABLE class=tech border=1>
<TBODY>
<TR>
<TD><font color="#FFFFFF">屬性</font></TD>
<TD><font color="#FFFFFF">含量</font></TD>
</TR>
<TR>
<TD><font color="#FFFFFF">%FOUND</font></TD>
<TD><font color="#FFFFFF">布爾型屬性,當(dāng)最近一次該記錄時成功返回,則值為TRUE</font></TD>
</TR>
<TR>
<TD><font color="#FFFFFF">%NOTFOUND</font></TD>
<TD><font color="#FFFFFF">布爾型屬性,它的值總與%FOUND屬性的值相反</font></TD>
</TR>
<TR>
<TD><font color="#FFFFFF">%ISOPEN</font></TD>
<TD><font color="#FFFFFF">布爾型屬性,當(dāng)光標(biāo)是打開時返回TRUE</font></TD>
</TR>
<TR>
<TD><font color="#FFFFFF">%ROWCOUNT</font></TD>
<TD><font color="#FFFFFF">數(shù)字型屬性,返回已從光標(biāo)中讀取的記錄數(shù)</font></TD>
</TR>
</TBODY>
</TABLE>
<font color="#FFFFFF"><BR>
4、關(guān)閉光標(biāo)<BR>
CLOSE語句關(guān)閉以前打開的光標(biāo),使得活動集不確定。當(dāng)用戶的程序或會話結(jié)束時,b.gifOracle</A>隱式關(guān)閉光標(biāo)。光標(biāo)被關(guān)閉后,就不能對它執(zhí)行任何操作了,否則將引發(fā)異常。<BR>
</font>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width=580
borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#CCCCCC><font color="#000000">CLOSE語句的語法是:<BR>
CLOSE cursor_name;<BR>
其中,cursor_name是以前打開的光標(biāo)的名稱。<BR>
完整的程序代碼如下:<BR>
DECLARE<BR>
CURSOR C1 IS SELECT VIEW_NAME FROM ALL_VIEWS<BR>
WHERE ROWNUM<=10<BR>
ORDER BY VIEW_NAME;<BR>
VNAME VARCHAR2(40);<BR>
BEGIN<BR>
OPEN C1;<BR>
FETCH C1 INTO VNAME;<BR>
WHILE C1%FOUND LOOP<BR>
DBMS_OUTPUT.PUT_LINE(TO_CHAR(C1%ROWCOUNT)||''||VNAME);<BR>
END LOOP;<BR>
END;<BR>
……CLOSE C1;<BR>
</font></TD>
</TR>
</TBODY>
</TABLE>
<font color="#FFFFFF"><BR>
<B>四、 小結(jié)</B><BR>
光標(biāo)是一種結(jié)構(gòu),能夠以一次一條記錄的方式處理多行查詢的結(jié)果.為每條DML語句創(chuàng)建隱式光標(biāo),而顯式光標(biāo)是由用戶創(chuàng)建的,以便處理返回多條記錄的查詢。而且,通過消除反復(fù)地分析代碼,光標(biāo)提高了代碼的處理速度。</font></FONT>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -