![DB2數(shù)據(jù)庫(kù)對(duì)象基礎(chǔ)知識(shí)_第1頁(yè)](http://file4.renrendoc.com/view11/M03/36/18/wKhkGWeoWgeAA0M3AAJ7H9l44YA232.jpg)
![DB2數(shù)據(jù)庫(kù)對(duì)象基礎(chǔ)知識(shí)_第2頁(yè)](http://file4.renrendoc.com/view11/M03/36/18/wKhkGWeoWgeAA0M3AAJ7H9l44YA2322.jpg)
![DB2數(shù)據(jù)庫(kù)對(duì)象基礎(chǔ)知識(shí)_第3頁(yè)](http://file4.renrendoc.com/view11/M03/36/18/wKhkGWeoWgeAA0M3AAJ7H9l44YA2323.jpg)
![DB2數(shù)據(jù)庫(kù)對(duì)象基礎(chǔ)知識(shí)_第4頁(yè)](http://file4.renrendoc.com/view11/M03/36/18/wKhkGWeoWgeAA0M3AAJ7H9l44YA2324.jpg)
![DB2數(shù)據(jù)庫(kù)對(duì)象基礎(chǔ)知識(shí)_第5頁(yè)](http://file4.renrendoc.com/view11/M03/36/18/wKhkGWeoWgeAA0M3AAJ7H9l44YA2325.jpg)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
17/17DB2數(shù)據(jù)庫(kù)對(duì)象根本數(shù)據(jù)庫(kù)對(duì)象數(shù)據(jù)庫(kù)對(duì)象是一個(gè)數(shù)據(jù)庫(kù)的構(gòu)造塊(buildingblock)。DB2提供了不同類(lèi)型的數(shù)據(jù)庫(kù)對(duì)象來(lái)存儲(chǔ)和表示不同信息。通過(guò)使用數(shù)據(jù)定義語(yǔ)言(DDL),可以創(chuàng)立、修改和刪除數(shù)據(jù)庫(kù)對(duì)象。要操縱數(shù)據(jù)庫(kù)對(duì)象,可以使用數(shù)據(jù)操縱語(yǔ)言(DML),例如SELECT、UPDATE、INSERT和SELECT語(yǔ)句。常用的數(shù)據(jù)庫(kù)對(duì)象有:表用戶定義數(shù)據(jù)類(lèi)型約束視圖索引除了FamilyFundamentals教程里介紹的一些數(shù)據(jù)庫(kù)對(duì)象外,還有一些其他的對(duì)象,很多開(kāi)發(fā)人員在開(kāi)發(fā)DB2應(yīng)用程序時(shí)會(huì)發(fā)現(xiàn)這些對(duì)象比較有用。本節(jié)我們將介紹這些對(duì)象。在繼續(xù)之前,有一點(diǎn)要注意:在下面看到的一些例子中,對(duì)象名稱(chēng)是以小寫(xiě)形式指定的。無(wú)論DB2在哪個(gè)平臺(tái)上運(yùn)行,它總是以大寫(xiě)形式存儲(chǔ)名稱(chēng),除非標(biāo)識(shí)符的名稱(chēng)以雙引號(hào)("")括起來(lái)了。例如,下面的語(yǔ)句創(chuàng)立一個(gè)名為employee(小寫(xiě))的表,該表的列定義與表EMPLOYEE(大寫(xiě))是一樣的。 CREATETABLE"employee"LIKEemployee別名別名(alias)是指一個(gè)已有的表、視圖的另一個(gè)名稱(chēng),也叫昵稱(chēng)(nickname)。別名也可以作為另一個(gè)別名的昵稱(chēng)。與這些對(duì)象一樣,別名也可以被創(chuàng)立或刪除,可以有與之相關(guān)的注釋。下面是CREATEALIAS語(yǔ)句的一些例子: CREATEALIASaliastab1FORtab1; CREATEALIASbob.aliastab1FORtom.tab1; CREATESYNONYMbob.aliastab2FORbob.aliastab1;可以看到,CREATEALIAS語(yǔ)句比較簡(jiǎn)單??梢栽谠磳?duì)象所在的同一模式中創(chuàng)立別名(如第1行),或者也可以全限定別名(如第2行)。為了與DB2forzSeries兼容,使用關(guān)鍵字SYNONYM代替ALIAS也是合法的(如第3行)。使用別名時(shí)無(wú)需專(zhuān)門(mén)的授權(quán)或權(quán)限。不過(guò),需要獲得與別名所引用的底層對(duì)象相關(guān)的授權(quán)。關(guān)于數(shù)據(jù)庫(kù)對(duì)象權(quán)限的完整清單,請(qǐng)參考DB2DBA認(rèn)證教程Servermanagement(請(qǐng)參閱參考資料)。前面已提到,我們也可以為昵稱(chēng)創(chuàng)立別名。昵稱(chēng)是引用位于聯(lián)邦系統(tǒng)上的數(shù)據(jù)表或視圖的數(shù)據(jù)庫(kù)對(duì)象。聯(lián)邦數(shù)據(jù)庫(kù)支持超出了本教程的范圍。在本教程系列的第2局部,Datamanipulation,我們將學(xué)習(xí)更多有關(guān)聯(lián)邦系統(tǒng)的知識(shí)。要為別名添加注釋?zhuān)梢园l(fā)出以下語(yǔ)句: COMMENTONaliastab1IS'Myfirstaliasontab1'要?jiǎng)h除一個(gè)別名,使用DROP語(yǔ)句,這與所有其他數(shù)據(jù)庫(kù)對(duì)象是一樣的: DROPALIASaliastab1序列對(duì)象序列(sequence)是一種數(shù)據(jù)庫(kù)對(duì)象,這種對(duì)象允許自動(dòng)生成值。序列對(duì)象與標(biāo)識(shí)列(identitycolumn)不同,標(biāo)識(shí)列是要與一個(gè)特定的表綁在一起的,而序列是一種全局的、獨(dú)立的對(duì)象,同一個(gè)數(shù)據(jù)庫(kù)中的任何表都可以使用它。標(biāo)識(shí)列是序列對(duì)象的一種特例。因此,標(biāo)識(shí)列的特征也適用于序列對(duì)象。下面就例釋了一條CREATESEQUENCE語(yǔ)句: CREATESEQUENCEmyseqASINTEGER STARTWITH360 INCREMENTBY10 NOMAXVALUE CYCLE CACHE20任何包括0在內(nèi)的數(shù)字?jǐn)?shù)據(jù)類(lèi)型都可用于序列值。這些類(lèi)型包括SMALLINT、INTEGER、BIGINT或DECIMAL?;谶@些數(shù)據(jù)類(lèi)型的任何用戶定義獨(dú)特類(lèi)型(distincttype)也都可以用于序列值。這進(jìn)一步擴(kuò)展了用戶定義獨(dú)特類(lèi)型在應(yīng)用程序中的使用。如上面的例子所示,您可以為序列對(duì)象指定起始值,從而自定義序列對(duì)象。在這個(gè)例子中,序列的第一個(gè)值是360。后續(xù)值的生成是由INCREMENTBY子句控制的。這里還支持正、負(fù)常量,以產(chǎn)生升序和降序值。缺省情況下,一個(gè)序列所生成的最小值和最大值是由該序列數(shù)據(jù)類(lèi)型的取值范圍來(lái)界定的。例如,INTEGER類(lèi)型的序列值必須處在-2,147,483,647到2,147,483,647之間的范圍內(nèi)。在DB2SQLReferenceGuide中可以找到所有數(shù)字?jǐn)?shù)據(jù)類(lèi)型的取值范圍。為了改變這種缺省行為,可以使用MINVALUE和MAXVALUE選項(xiàng)來(lái)為生成的值設(shè)置一個(gè)邊界。如果到達(dá)了最小值或最大值,那么可以使用另一個(gè)選項(xiàng),即CYCLE或NOCYCLE來(lái)規(guī)定序列值是否應(yīng)該循環(huán)。注意,如果CYCLE生效,則序列就可以生成重復(fù)的值。CACHE選項(xiàng)允許DB2將一些預(yù)先分配好空間的值保存在內(nèi)存中,以提高性能。CACHE20是缺省的行為。關(guān)于這個(gè)選項(xiàng)有一點(diǎn)要謹(jǐn)記:如果在所有緩存的值被使用之前關(guān)閉DB2,那么任何緩存的值和未使用的值都將被丟棄。當(dāng)DB2重新啟動(dòng)時(shí),又會(huì)生成和緩存下一塊的值,從而造成值之間的不連續(xù),即值之間存在間隔。如果應(yīng)用程序不允許值之間有間隔,可以考慮使用NOCACHE選項(xiàng)。如果沒(méi)有使用緩存,則性能就會(huì)下降,因?yàn)橐l繁地生成序列數(shù)字。每當(dāng)生成一個(gè)新值的時(shí)候,都會(huì)寫(xiě)下一條日志記錄。因此,更高效的做法是根據(jù)請(qǐng)求來(lái)獲取值,并將這些值緩存在內(nèi)存中。通過(guò)ALTERSEQUENCE語(yǔ)句,可以更改序列對(duì)象的特征。除了序列值的數(shù)據(jù)類(lèi)型以外,上面所討論的所有的設(shè)置都可以修改。要獲得完整的語(yǔ)法,請(qǐng)參考DB2SQLReferenceGuide(請(qǐng)參閱參考資料)。刪除一個(gè)序列對(duì)象與刪除任何其他的數(shù)據(jù)庫(kù)對(duì)象是一樣的,不同之處是這里還要使用到一個(gè)RESTRICT關(guān)鍵字。這樣可以防止在有依賴的情況下刪除序列。DROPSEQUENCEmyseqRESTRICT生成和獲取序列值序列是一種數(shù)據(jù)庫(kù)對(duì)象,因此對(duì)序列的訪問(wèn)也是由權(quán)限來(lái)控制的。缺省情況下,只有序列的創(chuàng)立者,即SYSADM和DBADM擁有該對(duì)象的USAGE權(quán)限。如果希望其他用戶也能夠使用序列,則需要使用下面的語(yǔ)句:GRANTUSAGEONSEQUENCEseq_object_nameTOPUBLIC有兩種表達(dá)式可用于生成和獲取序列值。NEXTVALFORseq-name用于獲取下一個(gè)序列值,而PREVVALFORseq-name則用于獲取上一個(gè)生成的序列值。下面的例子例釋了這些表達(dá)式的使用。INSERTINTOt1VALUES(NEXTVALFORmyseq,'BOB');INSERTINTOt1VALUES(NEXTVALFORmyseq,'PAT');COMMIT;INSERTINTOt1VALUES(NEXTVALFORmyseq,'GENE');ROLLBACK;INSERTINTOt1VALUES(NEXTVALFORmyseq,'PAUL');VALUESPREVVALFORmyseqINTO:hostvar假設(shè)我們以一個(gè)空表t1開(kāi)始,myseq的下一個(gè)序列值是1。如果禁用了autocommit,則在執(zhí)行上述語(yǔ)句之后,t1將包含下面幾行:1 NAME 1 BOB2 PAT4 PAUL 3record(s)selected.雖然為GENE生成的值被回滾了,但是DB2并沒(méi)有再次使用它。因而,下一個(gè)為PAUL生成的序列值就是4,而不是3。這個(gè)例子中的最后一條語(yǔ)句展示了如何使用PREVVAL表達(dá)式。宿主變量:hostvar存儲(chǔ)當(dāng)前會(huì)話中生成的最后一個(gè)值。如果想保存前面生成的值,那么應(yīng)該在生成下一個(gè)值之前保存PREVVAL值。臨時(shí)表顧名思義,臨時(shí)表(temporarytable)不是永久性的數(shù)據(jù)庫(kù)對(duì)象。臨時(shí)表與普通的表在行為上是一樣的,不同之處是,并非所有的功能和選項(xiàng)都是受支持的和/或是必需的。臨時(shí)表只能維持在一次連接期間。當(dāng)連接關(guān)閉時(shí),在此連接內(nèi)聲明的所有臨時(shí)表都將自動(dòng)刪除掉。只有聲明臨時(shí)表的會(huì)話或應(yīng)用程序才能訪問(wèn)臨時(shí)表。如果兩個(gè)應(yīng)用程序用相同的名字創(chuàng)立了一個(gè)臨時(shí)表,該臨時(shí)表的每個(gè)實(shí)例仍然是惟一的。因而,完全不必?fù)?dān)憂出現(xiàn)臨時(shí)數(shù)據(jù)沖突的情況。由于臨時(shí)表只允許單連接(single-connection)訪問(wèn),因此這里無(wú)需使用鎖。這正是臨時(shí)表的一個(gè)主要的性能優(yōu)勢(shì)。聲明臨時(shí)表要聲明一個(gè)臨時(shí)表,必須存在一個(gè)USER臨時(shí)表空間(不同于SYSTEM臨時(shí)表空間),用以存儲(chǔ)臨時(shí)表的定義和內(nèi)容。SYSTEM臨時(shí)表空間只是DB2在內(nèi)部用來(lái)執(zhí)行諸如排序之類(lèi)操作的。下面這條簡(jiǎn)單的語(yǔ)句將創(chuàng)立一個(gè)用戶臨時(shí)表空間。CREATEUSERTEMPORARYTABLESPACEusertempspaceMANAGEDBYSYSTEMUSING('usertempspace')聲明全局臨時(shí)表時(shí),可以使用很多可選子句。下面的例子對(duì)這些子句的特性作了說(shuō)明。DECLAREGLOBALTEMPORARYTABLEt_dept(deptidCHAR(6),deptnameCHAR(20))ONCOMMITDELETEROWSNOTLOGGEDINusertempspace在這個(gè)例子中,聲明了臨時(shí)表t_dept,這個(gè)表有兩列。ONCOMMITDELETEROWS子句規(guī)定在每次執(zhí)行COMMIT操作時(shí)刪除臨時(shí)表的內(nèi)容。在DB2V8中,可以選擇記錄對(duì)臨時(shí)表的更改,以便回滾。這個(gè)例子規(guī)定對(duì)該表的更改是NOTLOGGED。這意味著對(duì)該表的任何操作,包括創(chuàng)立以及更改,都不做日志記錄。如果在一個(gè)工作單位內(nèi)創(chuàng)立表,然后回滾,則臨時(shí)表將被刪除。另一方面,如果在此工作單位內(nèi)刪除該表,則該表在恢復(fù)時(shí)將沒(méi)有任何行。無(wú)需使用IN子句來(lái)指定該臨時(shí)表將要使用的用戶臨時(shí)表空間。如果沒(méi)有指定該信息,DB2就會(huì)搜索最適用的表空間。如果找不到用戶臨時(shí)表空間,DB2將產(chǎn)生一個(gè)錯(cuò)誤。讓我們看看另一個(gè)例子:DECLAREGLOBALTEMPORARYTABLEt_projLIKEprojectONCOMMITPRESERVEROWSWITHREPLACEINusertempspace臨時(shí)表t_proj是用LIKE關(guān)鍵字聲明的,因此它擁有與名為project的持久表或視圖相同的列定義。ONCOMMITPRESERVEROWS子句說(shuō)明,在執(zhí)行COMMIT語(yǔ)句時(shí),該臨時(shí)表中的所有行都將被保存。因此,這些行就可以在下一次事務(wù)中用于進(jìn)一步的處理。在同一次會(huì)話中使用相同的名稱(chēng)聲明另一個(gè)臨時(shí)表之前,首先必須刪除該臨時(shí)表??梢燥@式地刪除該表,也可以像這里一樣使用WITHREPLACE選項(xiàng)。如果使用了WITHREPLACE選項(xiàng),DB2將隱式地刪除所有數(shù)據(jù),刪除該臨時(shí)表,并用新的定義重新創(chuàng)立該臨時(shí)表。如果使用了連接池(connectionpooling),WITHREPLACE選項(xiàng)用起來(lái)就十分方便了。連接池是用于重用數(shù)據(jù)庫(kù)連接的一種機(jī)制,這樣就不必完全按照要求分配和回收資源。這些操作的開(kāi)銷(xiāo)都是相當(dāng)大的,尤其是在有大量執(zhí)行很短事務(wù)的連接時(shí),更是如此。由于沒(méi)有釋放連接,先前使用的臨時(shí)表就可能得不到去除。下一個(gè)使用該連接的應(yīng)用程序就可能使用上一次執(zhí)行時(shí)遺留下來(lái)的數(shù)據(jù)。因此,使用WITHREPLACE選項(xiàng)可以保證用新的定義刷新所聲明的臨時(shí)表。模式與數(shù)據(jù)庫(kù)對(duì)象大多數(shù)數(shù)據(jù)庫(kù)對(duì)象都是用一個(gè)模式(schema)和一個(gè)對(duì)象名(objectname)標(biāo)識(shí)的。數(shù)據(jù)庫(kù)模式為數(shù)據(jù)庫(kù)對(duì)象提供邏輯上的分類(lèi)。下面例釋了這種分為兩局部的對(duì)象名:DB2ADMIN.EMPLOYEEHRPROD.AUDIT_VIEWHRPROD.AUDIT_TRIG 如果在訪問(wèn)數(shù)據(jù)庫(kù)對(duì)象時(shí)沒(méi)有指定模式,則用于建立數(shù)據(jù)庫(kù)連接的用戶ID將被設(shè)為缺省的模式。例如,如果用戶db2admin連接到一個(gè)數(shù)據(jù)庫(kù),并創(chuàng)立表T1,則DB2將創(chuàng)立一個(gè)名為db2admin.T1的表。此后所有引用非全限定(unqualified)表名T1的SQL語(yǔ)句都解析為db2admin.T1。DB2專(zhuān)用存放器:CURRENTSCHEMA您在進(jìn)行自己的數(shù)據(jù)庫(kù)工作時(shí)可能已經(jīng)發(fā)現(xiàn),用同為對(duì)象的模式的用戶ID連接到一個(gè)數(shù)據(jù)庫(kù)并非總是可行的。而硬編碼(hard-coding)應(yīng)用程序以完全限定對(duì)象也不是最好的解決方法。幸運(yùn)的是,DB2允許使用SETCURRENTSCHEMA命令更改當(dāng)前模式。缺省情況下,CURRENTSCHEMADB2專(zhuān)用存放器被設(shè)置為連接到數(shù)據(jù)庫(kù)的USER。如果更改CURRENTSCHEMA,那么任何非全限定的數(shù)據(jù)庫(kù)對(duì)象都會(huì)在前面加上新的值。當(dāng)前模式可以通過(guò)下面這個(gè)命令獲得:VALUESCURRENTSCHEMA要對(duì)它進(jìn)行更改,只需使用下面的命令:SETSCHEMA=db2adminDB2應(yīng)用程序開(kāi)發(fā)數(shù)據(jù)庫(kù)對(duì)象例程在本節(jié)中,我們將介紹更多類(lèi)型的數(shù)據(jù)庫(kù)對(duì)象。這些對(duì)象統(tǒng)統(tǒng)都叫做例程(routine)。從功能上分,主要有三種例程:存儲(chǔ)過(guò)程(storedprocedure)、函數(shù)(function)和方法(method)。(要了解這些類(lèi)型之間的更多不同之處,請(qǐng)參閱存儲(chǔ)過(guò)程、函數(shù)和方法。)例程是封裝了與某一特定任務(wù)相關(guān)的編程和數(shù)據(jù)庫(kù)邏輯的數(shù)據(jù)庫(kù)對(duì)象。有效地使用例程可以簡(jiǎn)化應(yīng)用程序的代碼,并增加代碼的可重用性。例如,如果將某種業(yè)務(wù)邏輯封裝在一個(gè)例程中,那么對(duì)此業(yè)務(wù)規(guī)則的更改只會(huì)影響那個(gè)特定的例程。從而可最小化對(duì)應(yīng)用程序的更改。例程是在數(shù)據(jù)庫(kù)效勞器上定義和處理的。這樣就允許應(yīng)用程序利用數(shù)據(jù)庫(kù)效勞器的能力,從而減少客戶機(jī)上的處理負(fù)載。通常,復(fù)雜的業(yè)務(wù)邏輯需要多條SQL語(yǔ)句。這些語(yǔ)句要分別地從客戶機(jī)發(fā)送到效勞器,如果數(shù)據(jù)庫(kù)活動(dòng)很多,就會(huì)產(chǎn)生大量的網(wǎng)絡(luò)傳輸。如果將這些操作放在一個(gè)例程中,那么客戶機(jī)和效勞器之間的網(wǎng)絡(luò)傳輸就會(huì)大大減少,從而可以提高應(yīng)用程序的總體性能。加強(qiáng)平安的能力是使用例程的另一個(gè)關(guān)鍵優(yōu)勢(shì)。例程可用于屏蔽對(duì)底層數(shù)據(jù)庫(kù)對(duì)象的直接訪問(wèn)。用EXECUTE權(quán)限調(diào)用一個(gè)例程就足夠了,無(wú)需擁有訪問(wèn)底層數(shù)據(jù)庫(kù)對(duì)象的顯式的權(quán)限。例程的不同實(shí)現(xiàn)例程有幾種可能的實(shí)現(xiàn):內(nèi)置(built-in)例程是DB2系統(tǒng)附帶的。這些例程定義在一個(gè)系統(tǒng)模式中,例如SYSIBM、SYSPROC、SYSFUN和SYSTOOLS。Sourced例程只適用于函數(shù)。sourced例程復(fù)制另一個(gè)函數(shù)的語(yǔ)義。外部(external)例程是用一種外部的編程語(yǔ)言實(shí)現(xiàn)的。對(duì)于DB2V8.1,可以用以下受支持的語(yǔ)言開(kāi)發(fā)例程:Java語(yǔ)言C/C++OLE(僅用于存儲(chǔ)過(guò)程)OLEDB(僅用于表函數(shù))SQL例程是用SQLProceduralLanguage(SQLPL)實(shí)現(xiàn)的。DB2SQLPL是SQLPersistentStoredModules(SQL/PSM)語(yǔ)言標(biāo)準(zhǔn)的一個(gè)子集。該標(biāo)準(zhǔn)是與SQL一起用來(lái)編寫(xiě)存儲(chǔ)過(guò)程、函數(shù)和方法的結(jié)構(gòu)化編程語(yǔ)言的基礎(chǔ)。它將SQL數(shù)據(jù)訪問(wèn)的容易性與簡(jiǎn)單編程語(yǔ)言的流控制結(jié)構(gòu)相結(jié)合。這就是SQLPL如此流行的一個(gè)主要原因。存儲(chǔ)過(guò)程、函數(shù)和方法存儲(chǔ)過(guò)程是一種數(shù)據(jù)庫(kù)對(duì)象,它包含用于訪問(wèn)和修改一個(gè)或多個(gè)表中數(shù)據(jù)的專(zhuān)門(mén)程序。在一個(gè)存儲(chǔ)過(guò)程內(nèi),可以以一定的流邏輯包裝多條SQL語(yǔ)句。存儲(chǔ)過(guò)程可以作為對(duì)客戶機(jī)應(yīng)用程序或其他例程的子例程擴(kuò)展。存儲(chǔ)過(guò)程的執(zhí)行和管理是由一個(gè)關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)控制的。函數(shù)是可以自定義的SQL擴(kuò)展??梢栽赟QL語(yǔ)句(例如一個(gè)select-list或FROM子句)中調(diào)用函數(shù)。有四種類(lèi)型的函數(shù):聚合(aggregate)函數(shù)、標(biāo)量(scalar)函數(shù)、行(row)函數(shù)以及表(table)函數(shù)。存儲(chǔ)過(guò)程通常用于封裝復(fù)雜的應(yīng)用程序邏輯,以及執(zhí)行開(kāi)銷(xiāo)較大的數(shù)據(jù)庫(kù)操作,例如多表聯(lián)結(jié)和游標(biāo)操作。而函數(shù)――尤其是SQL函數(shù)――通常包含更簡(jiǎn)單的操作。編寫(xiě)在SQL函數(shù)中的語(yǔ)句將展開(kāi)到引用它們的SQL語(yǔ)句中,與這些SQL語(yǔ)句一起執(zhí)行。這導(dǎo)致這些語(yǔ)句在執(zhí)行時(shí)動(dòng)態(tài)編譯。如果一條SQL語(yǔ)句中使用了一個(gè)復(fù)雜的SQL函數(shù),則DB2要求使用附加的資源來(lái)編譯它,并生成一個(gè)數(shù)據(jù)訪問(wèn)方案。這樣將影響整個(gè)運(yùn)行時(shí)性能。方法用于封裝為結(jié)構(gòu)類(lèi)型提供行為的邏輯,結(jié)構(gòu)類(lèi)型包含一個(gè)或多個(gè)指定的屬性,各屬性有其自己的數(shù)據(jù)類(lèi)型。DB2專(zhuān)用存放器:CURRENTPATH與大多數(shù)DB2數(shù)據(jù)庫(kù)對(duì)象一樣,一個(gè)完整的例程名由一個(gè)模式和一個(gè)例程名組成。DB2專(zhuān)用存放器CURRENTSCHEMA可以為大多數(shù)數(shù)據(jù)庫(kù)對(duì)象解析模式,但不能為例程解析模式。相反,DB2是使用CURRENTPATH專(zhuān)用存放器來(lái)定位例程的。通過(guò)下面的命令可以獲得CURRENTPATH設(shè)置:VALUESCURRENTPATH缺省路徑包含三個(gè)系統(tǒng)模式,后面跟有連接到數(shù)據(jù)庫(kù)的當(dāng)前用戶。例如:"SYSIBM","SYSFUN","SYSPROC","DB2ADMIN"下面是一些例子和技巧,您可以用它們來(lái)更新PATH:SETPATH=CURRENTPATH,"USER2"VALUESCURRENTPATH"SYSIBM","SYSFUN","SYSPROC","DB2ADMIN","USER2"1record(s)selected.嵌入式SQL程序嵌入式SQL簡(jiǎn)介DB2為開(kāi)發(fā)人員提供了不同的編程方法來(lái)編寫(xiě)應(yīng)用程序。最直接的一種方法是嵌入式SQL編程。這種編程方法是直接的,因?yàn)槌绦蚯度肓酥苯优cDB2交互的SQL語(yǔ)句。程序可以用以下受支持的編程語(yǔ)言中的任何一種來(lái)編寫(xiě):C/C++FORTRANCOBOLJava語(yǔ)言(SQLJ)如何構(gòu)造嵌入式SQL語(yǔ)句取決于所選擇的編程語(yǔ)言。C/C++和FORTRAN中的嵌入式SQL語(yǔ)句前面要加上EXECSQL關(guān)鍵字:EXECSQLSELECTlastname,empidINTO:hostvar1,:hostvar2 FROMemployeeWHEREdeptno="OPERATIONS";COBOL中的嵌入式SQL語(yǔ)句非常類(lèi)似于C/C++中的那些嵌入式SQL語(yǔ)句,不同的是在語(yǔ)句的后面要使用END-EXEC關(guān)鍵字:EXECSQLSELECTlastname,empidINTO:hostvar1,:hostvar2FROMemployeeWHEREdeptno="OPERATIONS"END-EXEC;Java語(yǔ)言中的嵌入式SQL語(yǔ)句與前面兩個(gè)例子中展示的那些嵌入式SQL語(yǔ)句稍微有些不同,這里必須指定語(yǔ)句將來(lái)執(zhí)行時(shí)所在的連接上下文。下面是一個(gè)例子:#sql[myConnCtx]{SELECTlastname,empidINTO:hostvar1,:hostvar2FROMemployeeWHEREdeptno="OPERATIONS"};為了讓您更好地了解嵌入式SQL語(yǔ)句是什么樣子的,下面給出了用C編寫(xiě)的一個(gè)程序的代碼片斷。在本系列(請(qǐng)參閱參考資料)的第3篇教程中,您將了解到更多關(guān)于程序預(yù)編譯和實(shí)際代碼開(kāi)發(fā)的知識(shí)。intTbBasic(void){intrc=0;structsqlcasqlca; EXECSQLBEGINDECLARESECTION;charhostVarStmt[50];EXECSQLENDDECLARESECTION;/*delcarecursor*/EXECSQLDECLAREc1CURSORFORSELECTdeptnumb,deptnameFROMorgWHEREdeptnumb=40; /*opencursor*/EXECSQLOPENc1; /*fetchcursor*/EXECSQLFETCHc1INTO:deptnumb,:deptname; while(sqlca.sqlcode!=100){printf("%8d%-14s\n",deptnumb,deptname);EXECSQLFETCHc1INTO:deptnumb,:deptname;} /*closecursor*/EXECSQLCLOSEc1; /*preparethestatement*/strcpy(hostVarStmt,"DELETEFROMorgWHEREdeptnumb=15");EXECSQLPREPAREStmtFROM:hostVarStmt; /*executethestatement*/EXECSQLEXECUTEStmt; /*ROLLBACKthetransaction*/EXECSQLROLLBACK; return0;}靜態(tài)SQL在前一小節(jié)中,我們演示了兩種不同類(lèi)型的嵌入式SQL語(yǔ)句:靜態(tài)嵌入式SQL和動(dòng)態(tài)嵌入式SQL。這個(gè)例子中的SELECT語(yǔ)句說(shuō)明了靜態(tài)SQL的使用。編寫(xiě)靜態(tài)SQL時(shí),必須指定完整的語(yǔ)句。表名、列名以及所引用的數(shù)據(jù)類(lèi)型都是的。惟一可以在運(yùn)行時(shí)指定的信息是使用宿主變量的SQL語(yǔ)句的WHERE子句中的值。編譯靜態(tài)SQL語(yǔ)句(或者,用DB2術(shù)語(yǔ)更確切地說(shuō),準(zhǔn)備好的(prepared)SQL語(yǔ)句)時(shí),將為其生成數(shù)據(jù)訪問(wèn)方案,并存儲(chǔ)在數(shù)據(jù)庫(kù)中的一個(gè)包里面。當(dāng)調(diào)用包含該語(yǔ)句的應(yīng)用程序時(shí),這個(gè)包將被執(zhí)行。由于在運(yùn)行時(shí)不需要編譯語(yǔ)句,因此執(zhí)行靜態(tài)SQL時(shí)沒(méi)用編譯開(kāi)銷(xiāo)。在準(zhǔn)備語(yǔ)句時(shí),DB2使用數(shù)據(jù)庫(kù)統(tǒng)計(jì)信息和配置參數(shù)來(lái)估計(jì)和獲得訪問(wèn)方案。如果數(shù)據(jù)庫(kù)統(tǒng)計(jì)信息有變化,則預(yù)先生成的訪問(wèn)方案可能不如一開(kāi)始生成時(shí)那樣是最正確的。創(chuàng)立包和將包與數(shù)據(jù)庫(kù)綁定時(shí),要對(duì)準(zhǔn)備靜態(tài)SQL語(yǔ)句的人進(jìn)行授權(quán)。只要執(zhí)行包的人擁有包的EXECUTE權(quán)限,他就不需要具備該包中所引用的數(shù)據(jù)庫(kù)對(duì)象上的顯式的權(quán)限。動(dòng)態(tài)SQL動(dòng)態(tài)(DynamicSQL)語(yǔ)句是在運(yùn)行時(shí)動(dòng)態(tài)處理的。語(yǔ)句的結(jié)構(gòu)直到執(zhí)行應(yīng)用程序時(shí)才需要。注意,嵌入式SQL簡(jiǎn)介中展示的例子SQL語(yǔ)句使用動(dòng)態(tài)SQL來(lái)PREPARE和EXECUTE一條DELETE語(yǔ)句。DELETE語(yǔ)句的文本存儲(chǔ)在一個(gè)宿主變量hostVarStmt中。當(dāng)該語(yǔ)句PREPARE好后,系統(tǒng)將生成該語(yǔ)句的一個(gè)可執(zhí)行格式,并將其存儲(chǔ)在數(shù)據(jù)庫(kù)中的一個(gè)包里面。一旦生成了數(shù)據(jù)訪問(wèn)方案,準(zhǔn)備好的語(yǔ)句就可以EXECUTE了。聽(tīng)起來(lái)好似有點(diǎn)熟悉,不是嗎?是的:這兩個(gè)處理階段與靜態(tài)SQL語(yǔ)句正好是一樣的。惟一的不同點(diǎn)是,動(dòng)態(tài)SQL的PREPARE和EXECUTE都是在運(yùn)行時(shí)進(jìn)行,而靜態(tài)SQL在預(yù)編譯時(shí)準(zhǔn)備訪問(wèn)方案,并將其保存在數(shù)據(jù)庫(kù)中。動(dòng)態(tài)SQL語(yǔ)句必須總是在執(zhí)行之前準(zhǔn)備好,不管是否有相同的語(yǔ)句(相同的訪問(wèn)方案)一次又一次地重復(fù)使用。為了最小化這些準(zhǔn)備工作的開(kāi)銷(xiāo),DB2提供了包緩存(也叫動(dòng)態(tài)查詢緩存),用以將經(jīng)常使用的訪問(wèn)方案保存在內(nèi)存中。包緩存(packagecache)明顯地減少了重復(fù)的SQL準(zhǔn)備請(qǐng)求的代價(jià),然而發(fā)起和響應(yīng)準(zhǔn)備請(qǐng)求的開(kāi)銷(xiāo)仍然存在。在準(zhǔn)備語(yǔ)句時(shí),總是使用當(dāng)前數(shù)據(jù)庫(kù)統(tǒng)計(jì)信息。因此,就可以生成最正確的數(shù)據(jù)訪問(wèn)路徑。SQL語(yǔ)句的授權(quán)是在運(yùn)行時(shí)決定的。執(zhí)行應(yīng)用程序的人必須有適當(dāng)?shù)臋?quán)限來(lái)訪問(wèn)語(yǔ)句中所引用的數(shù)據(jù)庫(kù)對(duì)象。下一小節(jié)將更詳細(xì)地討論DB2權(quán)限。平安考慮要預(yù)編譯嵌入式靜態(tài)SQL程序,用戶需要程序中所引用數(shù)據(jù)庫(kù)對(duì)象的顯式的權(quán)限。由于預(yù)編譯或PREPARE階段會(huì)生成一個(gè)包,并將其存儲(chǔ)在數(shù)據(jù)庫(kù)中,因此該用戶還必須擁有BINDADD權(quán)限,以便添加新的包到數(shù)據(jù)庫(kù)中。為了執(zhí)行帶有靜態(tài)SQL的程序,用戶只需具有相關(guān)包上的EXECUTE權(quán)限。編譯嵌入式動(dòng)態(tài)SQL程序的用戶也需要BINDADD權(quán)限。這里不再需求其他的權(quán)限,因?yàn)閯?dòng)態(tài)SQL不是在編譯時(shí)準(zhǔn)備的。在程序執(zhí)行時(shí),用戶需要所有必需的權(quán)限來(lái)發(fā)出每條SQL語(yǔ)句,同時(shí)還需要為嵌入式SQL程序創(chuàng)立的包上的EXECUTE權(quán)限。下面的表總結(jié)了預(yù)編譯和執(zhí)行一個(gè)只有靜態(tài)SQL或只有動(dòng)態(tài)SQL的程序所需的權(quán)限。靜態(tài)SQL與動(dòng)態(tài)SQL在下面的表中,讓我們總結(jié)并詳細(xì)闡述我們所學(xué)到的關(guān)于靜態(tài)SQL和動(dòng)態(tài)SQL的知識(shí):基于驅(qū)動(dòng)程序的API基于驅(qū)動(dòng)程序的API雖然大多數(shù)供給商都支持嵌入式SQL數(shù)據(jù)庫(kù)訪問(wèn),但如果您想要使用同樣的源代碼,并將嵌入式SQL應(yīng)用程序部署到多個(gè)數(shù)據(jù)庫(kù)系統(tǒng)上,那么還需要一個(gè)額外的工作。必須用不同供給商的特定的預(yù)編譯器預(yù)編譯程序。還必須生成數(shù)據(jù)訪問(wèn)方案,并綁定到目標(biāo)數(shù)據(jù)庫(kù)。為了增加應(yīng)用程序的可移植性,還應(yīng)考慮使用本節(jié)介紹的基于驅(qū)動(dòng)程序的解決方案?;隍?qū)動(dòng)程序的解決方案需要一個(gè)驅(qū)動(dòng)程序管理器(drivermanager),這是與應(yīng)用程序打交道的界面。驅(qū)動(dòng)程序管理器提供了一套工業(yè)標(biāo)準(zhǔn)的應(yīng)用程序編程接口(API),用于訪問(wèn)數(shù)據(jù)源。應(yīng)用程序調(diào)用這些API,然后被編譯,再與管理器的庫(kù)鏈接。因?yàn)轵?qū)動(dòng)程序遵從標(biāo)準(zhǔn),所以應(yīng)用程序可以很容易地使用(或裝載)正確的驅(qū)動(dòng)程序來(lái)訪問(wèn)不同供給商的數(shù)據(jù)源。在下面幾小節(jié)中,我們將看看DB2支持的一些API。在本系列后面的教程中,您將更詳細(xì)地了解這些API。CLI和ODBCAPIDB2CallLevelInterface(CLI)是IBM對(duì)DB2數(shù)據(jù)庫(kù)效勞器的可調(diào)用SQL接口。CLI是用于數(shù)據(jù)訪問(wèn)的一個(gè)C/C++應(yīng)用程序編程接口(API)。您可以使用DB2CLI開(kāi)發(fā)動(dòng)態(tài)應(yīng)用程序,就像使用嵌入式動(dòng)態(tài)SQL語(yǔ)句進(jìn)行開(kāi)發(fā)一樣。在這兩種情況下,SQL語(yǔ)句都是在運(yùn)行時(shí)準(zhǔn)備和處理的。嵌入式動(dòng)態(tài)SQL要求有一個(gè)預(yù)編譯器,而DB2CLI則沒(méi)有這種要求。您只需編譯應(yīng)用程序,并與DB2CLI驅(qū)動(dòng)程序庫(kù)鏈接。DB2CLI是基于MicrosoftOpenDatabaseConnectivity(ODBC)和X/OpenCLI標(biāo)準(zhǔn)的。在ODBC環(huán)境中,應(yīng)用程序與數(shù)據(jù)庫(kù)效勞器之間的聯(lián)系要通過(guò)ODBC驅(qū)動(dòng)程序管理器。該管理器動(dòng)態(tài)地加載應(yīng)用程序需連接的數(shù)據(jù)庫(kù)效勞器所需的驅(qū)動(dòng)程序。ODBC提供某些級(jí)別的功能支持,當(dāng)前的DB2CLI遵從ODBC3.51。要開(kāi)發(fā)DB2CLI應(yīng)用程序,需要DB2ApplicationDevelopmentClient。它包括編譯和鏈接CLI應(yīng)用程序時(shí)所有必需的頭文件和庫(kù)。而要開(kāi)發(fā)ODBC應(yīng)用程序,則需要Microsoft提供的一個(gè)ODBCDeveloper'sSoftwareKit。下面的圖對(duì)DB2CLI與ODBC環(huán)境作了快速的比較。OLEDB與ADO.NETAPIMicrosoftObjectLinkEmbeddedDatabase(OLEDB)是一套接口,它為應(yīng)用程序提供了對(duì)存儲(chǔ)在不同信息源上的數(shù)據(jù)的統(tǒng)一訪問(wèn),這些不同的信息源包括關(guān)系數(shù)據(jù)源和非關(guān)系數(shù)據(jù)源。OLEDB架構(gòu)由OLEDB提供者和OLEDB消費(fèi)者組成。DB2同時(shí)支持這兩種角色。為了使DB2能夠充當(dāng)OLEDB提供者,必須要有IBMOLEDBProviderforDB2。這是一個(gè)本地驅(qū)動(dòng)程序,支持通過(guò)OLE接口提取或查詢DB2數(shù)據(jù)。下面的圖展示了一個(gè)可作為OLEDB消費(fèi)者的DB2數(shù)據(jù)庫(kù),它可以訪問(wèn)來(lái)自任何遵從OLEDB的數(shù)據(jù)源(例如一個(gè)電子表格)的數(shù)據(jù)。同樣的DB2效勞器也可以作為一個(gè)OLEDB提供者,為OLEDB消費(fèi)者提供數(shù)據(jù)。ActiveXDataObject.NET(ADO.NET)是Microsoft提供的另一種數(shù)據(jù)訪問(wèn)應(yīng)用程序接口。它是一種新的數(shù)據(jù)訪問(wèn)模型,將其前任(ADO)最好的特性與傳統(tǒng)的數(shù)據(jù)庫(kù)訪問(wèn)相結(jié)合,集成了XML支持,是一種斷開(kāi)連接的(disconnected)數(shù)據(jù)架構(gòu)。有三種方法從一個(gè).NET應(yīng)用程序連接到一個(gè)DB2數(shù)據(jù)庫(kù),如以下圖所示。JDBC和SQLJAPI至今為止,Java平臺(tái)已經(jīng)享譽(yù)多時(shí),但仍有很多人正在致力于擴(kuò)展其功能和提高其性能。訪問(wèn)和操縱DB2的Java程序可以使用JavaDatabaseConnectivity(JDBC)API,以及EmbeddedSQLforJava(SQLJ)標(biāo)準(zhǔn)。這兩個(gè)選項(xiàng)都是供給商無(wú)關(guān)的SQL接口,通過(guò)標(biāo)準(zhǔn)化的Java方法為應(yīng)用程序提供數(shù)據(jù)訪問(wèn)。JDBC是用于關(guān)系數(shù)據(jù)庫(kù)訪問(wèn)的實(shí)際上的標(biāo)準(zhǔn)JavaAPI,這種訪問(wèn)通過(guò)強(qiáng)大的面向?qū)ο蟮慕涌冢褂脛?dòng)態(tài)SQL。JDBC將動(dòng)態(tài)SQL傳遞給DB2附帶的一個(gè)JDBC驅(qū)動(dòng)程序。DB2通過(guò)JDBCAPI執(zhí)行SQL語(yǔ)句,結(jié)果被傳回給Java代碼。JDBC類(lèi)似于DB2CLI,您無(wú)需預(yù)編譯或綁定JDBC程序,因?yàn)镴DBC使用動(dòng)態(tài)SQL。而SQLJ程序則包含靜態(tài)嵌入式SQL語(yǔ)句。準(zhǔn)備一個(gè)SQLJ程序時(shí)需要通過(guò)類(lèi)似于預(yù)編譯和綁定的步驟。在編譯SQLJ源文件之前,必須用SQLJ翻譯器對(duì)其進(jìn)行翻譯,以創(chuàng)立本地Java源代碼。完成翻譯后,需要使用DB2forJavapro(db2profc)創(chuàng)立DB2包。DB2遺留的基于CLI的JDBC驅(qū)動(dòng)程序根據(jù)Java2Platform,EnterpriseEdition(J2EE)標(biāo)準(zhǔn),用于獲得數(shù)據(jù)訪問(wèn)的Java方法和接口可以打包成JDB
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 加強(qiáng)個(gè)人職業(yè)技能提升的步驟計(jì)劃
- 班級(jí)工作計(jì)劃安排方案
- 開(kāi)展班級(jí)技能培訓(xùn)的路徑計(jì)劃
- 2025年紡織染整助劑:凈洗劑項(xiàng)目發(fā)展計(jì)劃
- 2025年紡織、服裝、鞋帽批發(fā)服務(wù)項(xiàng)目發(fā)展計(jì)劃
- 2025年錘紋漆合作協(xié)議書(shū)
- 承包合同屬于勞務(wù)合同
- 關(guān)于項(xiàng)目延期原因的書(shū)面解釋報(bào)告
- 礦山合作協(xié)議跟承包協(xié)議
- 關(guān)于辦公資源調(diào)配的通知
- 卡爾威特的教育讀書(shū)感悟
- 低壓電工證1500題模擬考試練習(xí)題
- 建筑工程經(jīng)濟(jì)(高職)全套教學(xué)課件
- 非哺乳期乳腺炎患者的護(hù)理
- 個(gè)人投資收款收據(jù)
- 建材行業(yè)較大風(fēng)險(xiǎn)識(shí)別與防范手冊(cè)
- 2024年01月2023年上海證券交易所社會(huì)招考聘用筆試歷年高頻難、易錯(cuò)考點(diǎn)帶答案解析
- 工藝能力分析報(bào)告
- 淋巴瘤的治療及護(hù)理
- 健身房眾籌方案
- 護(hù)理帶教匯報(bào)課件
評(píng)論
0/150
提交評(píng)論