當(dāng)需要從數(shù)據(jù)庫中同時(shí)讀取多條記錄的時(shí)候,就需要使用游標(biāo)進(jìn)行操作。游標(biāo)CURSOR是一個(gè)與SELECT語句相關(guān)聯(lián)的符號名,游標(biāo)的最大好處是可以讓用戶逐行的訪問表中的記錄。使用游標(biāo)的典型的過程如下:
????? ?1)用DECLARE關(guān)鍵字聲明游標(biāo)。
????? ?2)使用OPEN語句打開游標(biāo)
????? ?3)使用FETCH語句讀取一行數(shù)據(jù)
?????? 4)處理數(shù)據(jù)
?????? 5)判斷是否已經(jīng)讀取完所有的數(shù)據(jù),未讀完數(shù)據(jù)的話,GOTO步驟3
????? ?6)使用CLOSE關(guān)鍵字關(guān)閉游標(biāo)
?
??? (1)DECLARE 語句
???? 在使用游標(biāo)之前,需要使用DECLARE語句聲明游標(biāo),使用DECLARE語句聲明游標(biāo)的格式如下:
?????????
DECLARE CursorName CURSOR FOR SelectStatement
????????? [USING TransactionObject]
???? 其中CursorName是游標(biāo)的名稱,可以使用任何有效的標(biāo)識符來表示;SelectStatement是任何有效的Select語句;TransactionObject是事務(wù)對象名,默認(rèn)時(shí)使用SQLCA(SQL通信區(qū)).
???? 例如,下面的語句聲明了一個(gè)名字叫做student_sur的游標(biāo),該游標(biāo)使用了默認(rèn)事務(wù)對象SQLCA和一個(gè)變量le_sex,其作用就是選取某個(gè)性別的所有的學(xué)生的學(xué)號和姓名:
?????????? DECLARE? student_cur CURSOR FOR
?????????? SELECT student,student_id,student.student_name
?????????? FROM student WHERE student.sex=:ls_sex
???? DECLARE是個(gè)聲明語句,可以像聲明標(biāo)準(zhǔn)數(shù)據(jù)類型那樣把游標(biāo)聲明稱局部變量,實(shí)例變量或者是全局變量.它并不真正的執(zhí)行,因此在DECLARE語句后,也無須檢查事務(wù)對象的SQLCode屬性.
值得注意的是DECLARE雖然是一個(gè)聲明語句,但是仍舊需要使用分號作為結(jié)束符.
?
???? (2)OPEN語句
???? OPEN語句打開已經(jīng)聲明的游標(biāo)并且執(zhí)行相應(yīng)的SELECT語句,其語法格式是:
?????????
OPEN CursorName;
???? 其中,CursorName是已經(jīng)使用DECLARE語句聲明的游標(biāo)名,例如:
????????? open student_cur;
?
?? (3)FETCH語句
?????FETCH語句從游標(biāo)中讀取當(dāng)前記錄并且把它保存到指定的變量中,只要數(shù)據(jù)庫支持,還可以使用FECTH FIRST,FETCH PRIOR,FETCH LAST。FETCH語句的語法格式為:
?????????
FETCH CursorName INTO VariableList
???? 其中,CursorName是OPEN語句打開的游標(biāo)名;VariableList是與Select語句中選擇字段相對應(yīng)的變量列表,例如,對前面DECLARE語句說明的游標(biāo),可以使用下面的語句讀取記錄:
????????? string ls_student,ls_student_name
????????? FETCH student_cur INTO :ls_student_id,:ls_student_name;
???? 每執(zhí)行一次FETCH語句都會從游標(biāo)中讀取一行記錄,需要讀取多行記錄時(shí)需要反復(fù)調(diào)用FETCH語句.執(zhí)行FETCH語句之后,應(yīng)該檢查事務(wù)對象的SQLCode屬性,該屬性為
0
的時(shí)候,表明成功的讀取當(dāng)前的記錄,如果SQLCode為
-1
的時(shí)候,表明讀取當(dāng)前的記錄失敗,為
100
的時(shí)候,表明已經(jīng)讀取完了所有的記錄.
?
???? (4)CLOSE語句
???? CLOSE語句關(guān)閉先前打開的游標(biāo).其語法格式為
?????????
CLOSE CursorName;
???? 其中,Cursorname是先前打開的游標(biāo)的名稱.
???? 關(guān)閉游標(biāo)之后,就不能再使用FETCH語句從游標(biāo)中讀取數(shù)據(jù)了,下面是關(guān)閉游標(biāo)的示例:
????????? CLOSE student_cur;
?
轉(zhuǎn)自: http://blog.csdn.net/ziwen00/article/details/5387131
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
