做模擬人生類的游戲下載網(wǎng)站廣告開戶南京seo
在某些PowerBuilder應(yīng)?程序的開發(fā)中,您可能根本?不到游標(biāo)這樣?個對象。因?yàn)樵谄渌?具開發(fā)中很多需?游標(biāo)實(shí)現(xiàn)的?作,在PowerBuilder中卻已有DataWin-dow來代勞了。事實(shí)上,DataWindow不僅可以替代游標(biāo)進(jìn)?從后臺數(shù)據(jù)庫查詢多條記錄的復(fù)雜操作,?且還遠(yuǎn)不?這些。但是同DataWindow和DataStore相?,游標(biāo)也有其??的優(yōu)點(diǎn),?如系統(tǒng)資源占?少,操作靈活,可根據(jù)需要定義變量類型如全局、實(shí)例或局部類型和訪問類型如私有或公共等。
游標(biāo)(Cursor)是一種用于處理數(shù)據(jù)庫查詢結(jié)果的機(jī)制。游標(biāo)提供了一種方式來逐行處理查詢結(jié)果,并對每一行數(shù)據(jù)進(jìn)行操作。以下是一個使用游標(biāo)的簡單例子
如要聲明?個叫作Cus-tomerCursor的游標(biāo)?以查詢地址在北京的客戶的姓名、帳號及其余額,您可以編寫如下代碼:
DECLARE CustomerCursor CURSOR FOR
SELECT acct_no,name,balance
FROM customer
WHERE province="北京";
在游標(biāo)的聲明中有?點(diǎn)值得注意的是,如同其它變量的聲明?樣,聲明游標(biāo)的這?段代碼?是不執(zhí)?的,您不能將debug時的斷點(diǎn)設(shè)在這?代碼?上,也不能?IF...END IF語句來聲明兩個同名的游標(biāo),如下列的代碼就是錯誤的。
IF Is_prov="北京"THEN
DECLARE CustomerCursor CURSOR FOR
SELECT acct_no,name,balance
FROM customer
WHERE province="北京";
ELSE
DECLARE CustomerCursor CURSOR FOR
SELECT acct_no,name,balance
FROM customer
WHERE province〈〉"北京";
END IF
打開游標(biāo)
聲明了游標(biāo)后在作其它操作之前,必須打開它。打開游標(biāo)是執(zhí)?與其相關(guān)的?段SQL語句,例如打開上例聲明的?個游標(biāo),我們只需鍵?:
OPEN CustomerCursor;
由于打開游標(biāo)是對數(shù)據(jù)庫進(jìn)??些SQL SELECT的操作,它將耗費(fèi)?段時間,主要取決于您使?的系統(tǒng)性能和這條語句的復(fù)雜程度。如果執(zhí)?的時間較長,可以考慮將屏幕上顯?的?標(biāo)改為hourglass。
提取數(shù)據(jù)
當(dāng)?OPEN語句打開了游標(biāo)并在數(shù)據(jù)庫中執(zhí)?了查詢后,您不能?即利?在查詢結(jié)果集中的數(shù)據(jù)。您必須?FETCH語句來取得數(shù)據(jù)。?條FETCH語句?次可以將?條記錄放?程序員指定的變量中。事實(shí)上,FETCH語句是游標(biāo)使?的核?。在DataWindow和DataStore中,執(zhí)?了Retrieve()函數(shù)以后,查詢的所有結(jié)果全部可以得到;?使?游標(biāo),我們只能逐條記錄地得到查詢結(jié)果。
已經(jīng)聲明并打開?個游標(biāo)后,我們就可以將數(shù)據(jù)放?任意的變量中。在FETCH語句中您可以指定游標(biāo)的名稱和?標(biāo)變量的名稱。如下例:
FETCH CustmerCur-sor
INTO:ls_acct_no,
:ls_name,
:ll_balance;
從語法上講,上?所述的就是?條合法的取數(shù)據(jù)的語句,但是?般我們使?游標(biāo)卻還應(yīng)當(dāng)包括其它的部分。正如我們前?所談到的,游標(biāo)只能?次從后臺數(shù)據(jù)庫中取?條記錄,?在多數(shù)情況下,我們所想要作的是在數(shù)據(jù)庫中從第?條記錄開始提取,?直到結(jié)束。所以我們?般要將游標(biāo)提取數(shù)據(jù)的語句放在?個循環(huán)體內(nèi),直?將結(jié)果集中的全部數(shù)據(jù)提取后,跳出循環(huán)圈。通過檢測SQLCA.SQL-CODE的值,可以得知最后?條FETCH語句是否成功。?般,當(dāng)SQLCODE值為0時表明?切正常,100表?已經(jīng)取到了結(jié)果集的末尾,?其它值均表明操作出了問題,這樣我們可以編寫以下的代碼:
lb_continue=True
ll_total=0
DO WHILE lb_continue
FETCH CustomerCur-sor
INTO:ls_acct_no,
:ls_name,
:ll_balance;
If sqlca.sqlcode=0 Then
ll_total+=ll_balance
Else
lb_continue=False
End If
LOOP
循環(huán)體的結(jié)構(gòu)有多種,這?提到的是最常見的?種。也有的程序員喜愛將?條FETCH語句放在循環(huán)體的前?,循環(huán)體內(nèi)再放置另外?條FETCH語句,并檢測SQLCA.SQLCODE是否為100。但是這樣做,維護(hù)時需同時修改兩條FETCH語句,稍?煩了些。
關(guān)閉游標(biāo)
在游標(biāo)操作的最后請不要忘記關(guān)閉游標(biāo),這是?個好的編程習(xí)慣,以使系統(tǒng)釋放游標(biāo)占?的資源。關(guān)閉游標(biāo)的語句很簡單:
CLOSE CustomerCursor;
使?Where?句?
我們可以動態(tài)地定義游標(biāo)中的Where?句的參數(shù),例如在本例中我們是直接定義了查詢省份是北京的記錄,但也許在應(yīng)?中我們要使??個下拉式列表框,由?戶來選擇要查詢的省份,我們該怎樣做呢?
我們在前?曾經(jīng)提到過,DECLARE語句的作?只是定義?個游標(biāo),在OPEN語句中這個游標(biāo)才會真正地被執(zhí)?。了解了這些,我們就可以很?便地實(shí)現(xiàn)這樣的功能,在DECLARE的Where?句中加?變量作參數(shù),如下所?:
DECLARE CustomerCursor CURSOR FOR
SELCECT acct_no,name,balance
FROM customer
WHERE province=:ls_province;
∥定義ls_province的值
OPEN CustomerCursor;
游標(biāo)的類型
同其它變量?樣,我們也可以定義游標(biāo)的訪問類型:全局、共享、實(shí)例或局部,游標(biāo)變量的命名規(guī)范建議也同其它變量?樣。
但是在目前強(qiáng)大的數(shù)據(jù)庫性能面前這種用法已經(jīng)很少。
?