?? 第六章 pl-sql與oracle間交互 - pl-sql用戶指南與參考 - whatiswhat.htm
字號(hào):
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap>sequence_name.<STRONG>CURRVAL</STRONG><BR>sequence_name.<STRONG>NEXTVAL</STRONG>
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>創(chuàng)建序列后,我們就可以在事務(wù)處理中用它產(chǎn)生唯一的順序編號(hào)了。但是,我們只能在用SELECT列表、VALUES子句和SET子句中使用CURRVAL和NEXTVAL。在下面的例子中,我們使用序列向兩個(gè)數(shù)據(jù)表中插入相同的雇員編號(hào):</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>INSERT</STRONG> <STRONG>INTO</STRONG> emp <STRONG>VALUES</STRONG> (empno_seq.<STRONG>NEXTVAL</STRONG>, my_ename, ...);<BR><STRONG>INSERT</STRONG> <STRONG>INTO</STRONG> sals <STRONG>VALUES</STRONG> (empno_seq.<STRONG>CURRVAL</STRONG>, my_sal, ...);
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>在事務(wù)中調(diào)用NEXTVAL時(shí),序列的值會(huì)立即發(fā)生改變,不管我們是否使用提交或回滾語句。 </P>
<UL>
<LI>LEVEL </LI></UL>
<P>我們可以用LEVEL配合SELECT CONNECT
BY語句把數(shù)據(jù)表中的行組織成一個(gè)樹形結(jié)構(gòu)。LEVEL能返回樹形結(jié)構(gòu)中節(jié)點(diǎn)的級(jí)數(shù)。根節(jié)點(diǎn)的級(jí)數(shù)是1,根節(jié)點(diǎn)的子節(jié)點(diǎn)級(jí)數(shù)是2,孫子節(jié)點(diǎn)級(jí)數(shù)是3,依次類推。</P>
<P>在START
WITH子句中,我們指定辨識(shí)根節(jié)點(diǎn)的條件。我們可以使用PRIOR操作符指定樹的遍歷方向(從根向下或從枝干向上)。
</P>
<UL>
<LI>ROWID </LI></UL>
<P>ROWID能夠返回?cái)?shù)據(jù)表中行的ROWID(二進(jìn)制地址)。我們可以使用UROWID類型變量來存放具有可讀性的ROWID,下例中,我們聲明了一個(gè)名為row_id的變量:</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>DECLARE</STRONG><BR> row_id UROWID;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>當(dāng)我們把物理rowid放到UROWID變量中時(shí),就要使用函數(shù)ROWIDTOCHAR,它能把二進(jìn)制值轉(zhuǎn)成一個(gè)長度為18字節(jié)的字符串。然后我們就可以在UPDATE或DELETE語句的WHERE子句中,把UROWID變量的值同ROWID偽列值進(jìn)行比較并找出從游標(biāo)中取得的最新行。
</P>
<UL>
<LI>ROWNUM </LI></UL>
<P>ROWNUM能夠返回從數(shù)據(jù)表中選出的行的標(biāo)識(shí)。被選取的第一行的ROWNUM是1,第二行是2,依次類推。如果SELECT語句包含一個(gè)ORDER
BY子句,ROWNUM會(huì)在排序操作之前被指定。</P>
<P>我們可以在UPDATE語句中用ROWNUM為每一行數(shù)據(jù)賦上一個(gè)唯一的值。同樣,也可以在SELECT語句的WHERE子句中用ROWNUM限定選取的行的個(gè)數(shù),如下例:</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>DECLARE</STRONG><BR> <STRONG>CURSOR</STRONG> c1 <STRONG>IS</STRONG><BR> <STRONG>SELECT</STRONG> empno, sal<BR> <STRONG>FROM</STRONG> emp<BR> <STRONG>WHERE</STRONG> sal > 2000 <STRONG>AND</STRONG> <STRONG>ROWNUM</STRONG> <= 10; <EM>-- returns 10 rows</EM>
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>ROWNUM的值只是在行被檢索出來的時(shí)候才會(huì)增長,所以,只有在WHERE子句中的ROWNUM才有意義:</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap>... <STRONG>WHERE</STRONG> <STRONG>ROWNUM</STRONG> < constant;<BR>... <STRONG>WHERE</STRONG> <STRONG>ROWNUM</STRONG> <= constant;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P class=title2>5、SQL操作符</P>
<P>PL/SQL能讓我們在SQL語句中使用所有的SQL比較操作符、集合操作符和行操作符。這里簡要描述一下其中幾個(gè)操作符的功能。
</P>
<UL>
<LI>比較操作符 </LI></UL>
<P>我們常常需要在一個(gè)數(shù)據(jù)操作語句的WHERE子句中使用比較操作符來判斷一個(gè)表達(dá)式的值是TRUE、FALSE還是NULL。下面的表格描述了各個(gè)操作符的用途:
</P>
<TABLE id=table-list>
<TBODY>
<TR>
<TH id=table-list-head>操作符</TH>
<TH id=table-list-head>描述</TH></TR>
<TR>
<TD vAlign=top>ALL</TD>
<TD>把同一個(gè)列表中的一個(gè)值與其他值或是子查詢返回的值進(jìn)行比較,如果所有的比較結(jié)果都為TRUE,那么結(jié)果值就為TRUE。</TD></TR>
<TR>
<TD vAlign=top noWrap>ANY, SOME</TD>
<TD>把同一個(gè)列表中的一個(gè)值與其它值或是子查詢返回的值進(jìn)行比較,只要其中有一個(gè)結(jié)果值為TRUE,那么結(jié)果值就為TRUE。</TD></TR>
<TR>
<TD>BETWEEN</TD>
<TD>測試一個(gè)值是否在指定的區(qū)間范圍內(nèi)。</TD></TR>
<TR>
<TD>EXISTS</TD>
<TD>如果子查詢至少返回一行數(shù)據(jù),那么EXISTS的結(jié)果就為TRUE。</TD></TR>
<TR>
<TD>IN</TD>
<TD>測試指定的值是否是集合成員。</TD></TR>
<TR>
<TD>IS</TD>
<TD>測試指定的值是否是NULL。</TD></TR>
<TR>
<TD>LIKE</TD>
<TD>測試一個(gè)字符串是否滿足一個(gè)指定的樣式,其中包含通配符。</TD></TR></TBODY></TABLE>
<UL>
<LI>集合操作符 </LI></UL>
<P>集合操作符的作用是把兩個(gè)查詢的結(jié)果合并成一個(gè)結(jié)果。INTERSECT返回兩個(gè)結(jié)果的交集;MINUS把目標(biāo)結(jié)果集與另外一個(gè)結(jié)果集比較,并把存在于另一個(gè)結(jié)果集中的記錄從目標(biāo)結(jié)果集中去除,然后返回目標(biāo)結(jié)果集;UNION把兩個(gè)結(jié)果集的內(nèi)容合并,在有重復(fù)項(xiàng)的情況下,只保留其中一項(xiàng);UNION
ALL同UNION的作用類似,但它會(huì)保留所有記錄,不管是否有相同的記錄。 </P>
<UL>
<LI>行操作符 </LI></UL>
<P>行操作符能返回或引用特定的行。ALL會(huì)保留查詢或聚合表達(dá)式中的重復(fù)行;DISTINCT的作用與ALL相反,用于消除重復(fù)行;PRIOR能引用樹形查詢中返回的當(dāng)前行的父級(jí)行。
</P>
<P class=title1>二、管理游標(biāo)</P>
<P>PL/SQL有兩種類型的游標(biāo):隱式游標(biāo)和顯式游標(biāo)。PL/SQL為所有的SQL數(shù)據(jù)操作語句都聲明了一個(gè)隱式的游標(biāo),其中也包括只返回一條記錄的查詢。但是,對于返回多于一條記錄的查詢來說,我們必須聲明顯式的游標(biāo),然后使用游標(biāo)FOR循環(huán)或使用BULK
COLLECT子句。 </P>
<P class=title2>1、顯式游標(biāo)一覽</P>
<P>查詢返回的行集合可能是由零行、一行或多行組成,這個(gè)結(jié)果取決于我們的檢索條件。當(dāng)一個(gè)查詢返回多行記錄時(shí),我們可以顯式地聲明一個(gè)游標(biāo)來處理每一行數(shù)據(jù)。游標(biāo)的聲明可以放到PL/SQL塊、子程序或包的聲明部分。</P>
<P>我們可以使用三種命令來控制游標(biāo):OPEN、FETCH和CLOSE。首先用OPEN語句初始化一個(gè)游標(biāo),然后重復(fù)執(zhí)行FETCH語句取出已檢索到的數(shù)據(jù),或是使用BULK
COLLECT批量選取數(shù)據(jù)。當(dāng)處理完結(jié)果集中最后一行數(shù)據(jù)時(shí),就可以用CLOSE語句關(guān)閉游標(biāo)。我們還可以同時(shí)打開多個(gè)游標(biāo)并發(fā)處理多個(gè)查詢操作。
</P>
<UL>
<LI>聲明游標(biāo) </LI></UL>
<P>在PL/SQL中,向前引用是不允許的。所以我們必須在其它語句引用游標(biāo)之前聲明它。聲明游標(biāo)時(shí),我們需要為它命名,并用下面的語法把它和一個(gè)查詢相關(guān)聯(lián):
</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>CURSOR</STRONG> cursor_name [(parameter[, parameter]...)]<BR> [<STRONG>RETURN</STRONG> return_type] <STRONG>IS</STRONG> select_statement;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>return_type必須是記錄或是數(shù)據(jù)表的行類型,parameter的含義如下:</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap>cursor_parameter_name [<STRONG>IN</STRONG>] datatype [{:= | <STRONG>DEFAULT</STRONG>} expression]
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>例如,我們可以像下面這樣聲明游標(biāo)c1和c2:</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>DECLARE</STRONG><BR> <STRONG>CURSOR</STRONG> c1 <STRONG>IS</STRONG><BR> <STRONG>SELECT</STRONG> empno, ename, job, sal<BR> <STRONG>FROM</STRONG> emp<BR> <STRONG>WHERE</STRONG> sal > 2000;<BR><BR> <STRONG>CURSOR</STRONG> c2 <STRONG>RETURN</STRONG> dept%<STRONG>ROWTYPE</STRONG> <STRONG>IS</STRONG><BR> <STRONG>SELECT</STRONG> *<BR> <STRONG>FROM</STRONG> dept<BR> <STRONG>WHERE</STRONG> deptno = 10;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>游標(biāo)名是一個(gè)未聲明的標(biāo)識(shí)符,而不是PL/SQL變量名。我們不能把值賦給游標(biāo)名或是在一個(gè)表達(dá)式中使用它。但是,游標(biāo)和變量有著同樣的作用域規(guī)則。雖然在數(shù)據(jù)表為游標(biāo)命名是允許的,但并不推薦這樣做。
</P>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -