• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            活用SQLCA

            Posted on 2009-06-03 20:32 Prayer 閱讀(411) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)庫(kù),SQLDB2
            ----DB2應(yīng)用程序使用SQL通訊區(qū)(SQLCA)將信息返回到程序中,有些信息是有用的,有些不是;有些是有意義的,有些不是。如果能它們區(qū)分開(kāi)來(lái),那么我們可以利用SQLCA信息來(lái)提高程序代碼的效率,減少DB2調(diào)用的開(kāi)銷,從而簡(jiǎn)化程序邏輯,提高性能。
            SQLCODE
            ----SQLCA中最常使用的域是SQLCODE,許多程序員知道在每一次調(diào)用DB2以后都應(yīng)該檢查SQLCODE,以確定該調(diào)用是否成功。大多數(shù)程序者會(huì)把SQLCODE是否為+0,作為成功調(diào)用的標(biāo)志。同時(shí)還會(huì)檢查SQLCODE是否為+100,作為文件結(jié)束的標(biāo)志(沒(méi)有記錄或沒(méi)有更多的記錄)。對(duì)于其他的SQLCODE,不管是正值或負(fù)值,程序一般都執(zhí)行錯(cuò)誤處理例程,結(jié)束程序或事務(wù)。但是,SQLCODE為負(fù)值并不一定表示錯(cuò)誤非常嚴(yán)重,以至于要結(jié)束程序。并且,某些SQLCODE為正值時(shí),可以有非常有趣的方式利用它。
            ----我們可以對(duì)一些負(fù)的SQLCODE定制響應(yīng)代碼,以減少CPU啟動(dòng)和運(yùn)行程序的開(kāi)銷。例如,可以編寫程序處理-911(不能獲得要求的鎖,事務(wù)被回滾),程序可以簡(jiǎn)單的重試,直到成功或重試計(jì)數(shù)到某一個(gè)值。但應(yīng)該注意的是:出于數(shù)據(jù)完整性的理由,重試必須從程序恰當(dāng)?shù)膱?zhí)行點(diǎn)開(kāi)始。重試點(diǎn)不一定是重新執(zhí)行失敗的語(yǔ)句,尤其是對(duì)那些隱式地回滾事務(wù)的SQLCODE。
            ----負(fù)的SQLCODE通常代表程序執(zhí)行中的意外錯(cuò)誤,但某些情況下,可以編寫特定的SQL語(yǔ)句故意使程序獲得負(fù)值返回,然后通過(guò)測(cè)試預(yù)期的負(fù)值,簡(jiǎn)化邏輯判斷的代碼,從而減少DB2頁(yè)面讀取的數(shù)目。
            ----例如,某一個(gè)大電話公司有兩種類型的發(fā)票:一種給只有一條電話線的住宅用戶,另一種給有多條電話線的公司用戶。在處理每一個(gè)客戶時(shí),處理客戶發(fā)票的程序?qū)υ摽蛻糇鲆淮蜟OUNT(電話賬單表非常大)。如果COUNT的結(jié)果為一,則程序轉(zhuǎn)入住宅用戶發(fā)票格式處理,如果COUNT的結(jié)果大于一,則轉(zhuǎn)入公司用戶發(fā)票格式處理。最后,在發(fā)票格式化的過(guò)程中,每個(gè)客戶的記錄又再次被讀入。在這種程序邏輯下,每一個(gè)客戶的賬單信息不必要地讀入了兩次,包括即些非常大的商業(yè)客戶,他們有幾百條電話線。
            ----其實(shí)可以將程序邏輯修改一下,對(duì)每一個(gè)客戶做的簡(jiǎn)單的選擇(SELECT ...INTO ),然后測(cè)試返回的SQLCODE是否為+0(即僅有一條電話線,轉(zhuǎn)入住宅用戶發(fā)票格式),或者-811(多于一條電話線,單選操作失敗,轉(zhuǎn)入公司用戶發(fā)票格式)。顯而易見(jiàn),這樣可以節(jié)省大量的時(shí)間。而其他的解決辦法或者需要改變表結(jié)構(gòu),并且占用數(shù)據(jù)庫(kù)管理員和程序員更多的時(shí)間。
            ----另一個(gè)利用SQLCODE來(lái)提高性能的例子如下:每一個(gè)輸入事務(wù)有兩種操作,如果有匹配記錄,則更新它,否則插入一條新記錄。效率低下的程序可能會(huì)首先做一個(gè)選取(SELECT),判斷記錄是否存在。然后當(dāng)SQLCODE為+0時(shí),已經(jīng)有的記錄會(huì)再次被讀入并更新;當(dāng)SQLCODE為+100時(shí),插入新的記錄。更有效率的方法應(yīng)該首先嘗試最常發(fā)生的情況。如果更新比插入更頻繁,則首先嘗試更新,并檢查SQLCODE是否為+0(成功更新了該記錄),如果SQLCODE為+100(未發(fā)現(xiàn)匹配的記錄),再插入該記錄。相反,如果插入比更新頻繁,則首先可以執(zhí)行插入,并檢查SQLCODE是否為+0(成功插入),或者-803(發(fā)現(xiàn)重復(fù)記錄),這時(shí)再更新該記錄。任何一種方法都可以消除不必要的重復(fù)選擇開(kāi)銷。
            SQL警告

            ----大多數(shù)程序都忽略SQL警告,但這樣做并不合適,因?yàn)榫鎸?duì)于測(cè)潛在問(wèn)題和簡(jiǎn)化程序邏輯很有幫助,所以雖然警告不是嚴(yán)重信息,但不應(yīng)該被忽略。
            ----在SQLCA中有兩個(gè)警告信息的指示:一個(gè)是SQLCODE大于+100;另一個(gè)是SQLWARN0域?yàn)閃。當(dāng)任何一個(gè)出現(xiàn)時(shí),就表明在上一次調(diào)用時(shí)DB2發(fā)生了一些值得注意的事情,雖然DB2返回了數(shù)據(jù),但是可能與預(yù)期的有出入。當(dāng)SQLWARN0是W時(shí),DB2也在其他SQLWARNn域提供了該問(wèn)題的有用信息。
            ----試舉一例,下面這條SELECT語(yǔ)句中帶有數(shù)學(xué)表達(dá)式:
            ----SELECT empid,comm/salary INTO :hvempid, :hvcalc FROM EMPLOYEE
            ----如果在某一條記錄碰上了數(shù)學(xué)異常,例如被0除,則返回代碼-802。沒(méi)有數(shù)據(jù)返回,也不知道是哪一條記錄導(dǎo)致了該錯(cuò)誤。但是,如果為數(shù)學(xué)表達(dá)式提供空值指示器宿主變量,改為:
            ----SELECT empid,comm/salary INTO :hvempid,:hvcalc :hvind FROM EMPLOYEE
            ----DB2將指示器變量設(shè)置為-2,并且返回SQLCODE為+802。這樣程序?qū)@得返回的empid,從而可以判斷哪個(gè)雇員的記錄造成了異常,程序也不需要終止。
            ----測(cè)試SQLWARN0是否為W也同樣有用。例如,如果程序?qū)⒆址當(dāng)?shù)據(jù)選取到宿主變量中,而該變量的長(zhǎng)度不足以容納整個(gè)字符串,則SQLCODE為+0,但數(shù)據(jù)被截?cái)嗔恕Mㄟ^(guò)提供指示器變量可以解決這個(gè)問(wèn)題,DB2把SQLWARN0設(shè)為W,SQLWARN1設(shè)為W,并且將指示器變量設(shè)為原始串的長(zhǎng)度,通過(guò)使用指示器變量中的值就可以判斷數(shù)據(jù)串的最大長(zhǎng)度。
            SQLERRD(3)
            ----SQLERRD數(shù)組的第三項(xiàng)是SQLCA中最有用的域之一。當(dāng)成功地完成了插入、更新或刪除以后,該域被設(shè)置為插入、更新或刪除的記錄數(shù)。如果不知道SQLCA中含有這樣的信息而程序又需要它,則不得不首先做一下COUNT。更糟糕的是,如果程序邏輯是將每一條記錄選取到程序中,增加計(jì)數(shù)值,然后逐個(gè)地插入、更新或刪除每一條記錄,這樣就喪失了集合操作的好處。這時(shí)最好的辦法就是做SQL多記錄插入、更新或刪除,然后檢查SQLERRD(3),獲取需要的計(jì)數(shù)。
            ----然而也有例外的情況,首先,在SQL刪除語(yǔ)句后,SQLERRD(3)并不包括DB2參照完整性而導(dǎo)致的級(jí)連刪除的記錄數(shù)。其次,從分段的表空間中海量刪除(即DELETE語(yǔ)句無(wú)WHERE子名),在SQLERRD(3)以-1表示。因?yàn)镈B2通過(guò)更新的記錄表空間映射頁(yè)來(lái)進(jìn)行分段表空間的海量刪除,實(shí)際的記錄并未被讀取,因此無(wú)法計(jì)數(shù)。除了這兩個(gè)例外的情況,SQLERRD(3)可以用來(lái)節(jié)省DB2的讀取操作。
            ----SQLCA共有24個(gè)域,詳細(xì)內(nèi)容可以參閱SQL參考手冊(cè)的附錄C,通過(guò)上述的例子說(shuō)明,SQLCA中有用的域不僅是SQLCODE,靈活使用其他域,可以簡(jiǎn)化程序邏輯,減少DB2調(diào)用次數(shù),從而提高程序性能。

            91精品国产高清91久久久久久| 9999国产精品欧美久久久久久| 久久久久人妻精品一区| 2021国内精品久久久久久影院| 亚洲精品乱码久久久久久蜜桃| 亚洲国产精品狼友中文久久久 | 99热精品久久只有精品| 91久久婷婷国产综合精品青草| 青青青青久久精品国产| 久久精品女人天堂AV麻| 少妇久久久久久久久久| 久久精品国产一区| 青青热久久国产久精品| 久久伊人精品青青草原高清| 日本高清无卡码一区二区久久| 日韩精品久久无码中文字幕| 久久人人爽人人爽人人片AV不| 久久久久综合中文字幕| 久久久亚洲欧洲日产国码aⅴ| 久久久久久国产精品无码下载| 国内精品久久久久影院优 | 国产999精品久久久久久| 亚洲美日韩Av中文字幕无码久久久妻妇 | 久久亚洲中文字幕精品一区四| 久久人人爽爽爽人久久久| 久久久黄片| 品成人欧美大片久久国产欧美| 国产精品久久久久影视不卡 | 久久精品国产网红主播| 久久精品国产男包| 中文成人无码精品久久久不卡 | 久久婷婷综合中文字幕| 99精品国产综合久久久久五月天| 精品国产91久久久久久久a| 久久国产乱子精品免费女| 国内精品久久久久影院日本| 久久亚洲日韩精品一区二区三区| 亚洲日本va中文字幕久久| 2021国产精品午夜久久| 国产成人综合久久精品红| 久久久午夜精品福利内容|