




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
17/17DB2數(shù)據庫對象根本數(shù)據庫對象數(shù)據庫對象是一個數(shù)據庫的構造塊(buildingblock)。DB2提供了不同類型的數(shù)據庫對象來存儲和表示不同信息。通過使用數(shù)據定義語言(DDL),可以創(chuàng)立、修改和刪除數(shù)據庫對象。要操縱數(shù)據庫對象,可以使用數(shù)據操縱語言(DML),例如SELECT、UPDATE、INSERT和SELECT語句。常用的數(shù)據庫對象有:表用戶定義數(shù)據類型約束視圖索引除了FamilyFundamentals教程里介紹的一些數(shù)據庫對象外,還有一些其他的對象,很多開發(fā)人員在開發(fā)DB2應用程序時會發(fā)現(xiàn)這些對象比較有用。本節(jié)我們將介紹這些對象。在繼續(xù)之前,有一點要注意:在下面看到的一些例子中,對象名稱是以小寫形式指定的。無論DB2在哪個平臺上運行,它總是以大寫形式存儲名稱,除非標識符的名稱以雙引號("")括起來了。例如,下面的語句創(chuàng)立一個名為employee(小寫)的表,該表的列定義與表EMPLOYEE(大寫)是一樣的。 CREATETABLE"employee"LIKEemployee別名別名(alias)是指一個已有的表、視圖的另一個名稱,也叫昵稱(nickname)。別名也可以作為另一個別名的昵稱。與這些對象一樣,別名也可以被創(chuàng)立或刪除,可以有與之相關的注釋。下面是CREATEALIAS語句的一些例子: CREATEALIASaliastab1FORtab1; CREATEALIASbob.aliastab1FORtom.tab1; CREATESYNONYMbob.aliastab2FORbob.aliastab1;可以看到,CREATEALIAS語句比較簡單??梢栽谠磳ο笏诘耐荒J街袆?chuàng)立別名(如第1行),或者也可以全限定別名(如第2行)。為了與DB2forzSeries兼容,使用關鍵字SYNONYM代替ALIAS也是合法的(如第3行)。使用別名時無需專門的授權或權限。不過,需要獲得與別名所引用的底層對象相關的授權。關于數(shù)據庫對象權限的完整清單,請參考DB2DBA認證教程Servermanagement(請參閱參考資料)。前面已提到,我們也可以為昵稱創(chuàng)立別名。昵稱是引用位于聯(lián)邦系統(tǒng)上的數(shù)據表或視圖的數(shù)據庫對象。聯(lián)邦數(shù)據庫支持超出了本教程的范圍。在本教程系列的第2局部,Datamanipulation,我們將學習更多有關聯(lián)邦系統(tǒng)的知識。要為別名添加注釋,可以發(fā)出以下語句: COMMENTONaliastab1IS'Myfirstaliasontab1'要刪除一個別名,使用DROP語句,這與所有其他數(shù)據庫對象是一樣的: DROPALIASaliastab1序列對象序列(sequence)是一種數(shù)據庫對象,這種對象允許自動生成值。序列對象與標識列(identitycolumn)不同,標識列是要與一個特定的表綁在一起的,而序列是一種全局的、獨立的對象,同一個數(shù)據庫中的任何表都可以使用它。標識列是序列對象的一種特例。因此,標識列的特征也適用于序列對象。下面就例釋了一條CREATESEQUENCE語句: CREATESEQUENCEmyseqASINTEGER STARTWITH360 INCREMENTBY10 NOMAXVALUE CYCLE CACHE20任何包括0在內的數(shù)字數(shù)據類型都可用于序列值。這些類型包括SMALLINT、INTEGER、BIGINT或DECIMAL。基于這些數(shù)據類型的任何用戶定義獨特類型(distincttype)也都可以用于序列值。這進一步擴展了用戶定義獨特類型在應用程序中的使用。如上面的例子所示,您可以為序列對象指定起始值,從而自定義序列對象。在這個例子中,序列的第一個值是360。后續(xù)值的生成是由INCREMENTBY子句控制的。這里還支持正、負常量,以產生升序和降序值。缺省情況下,一個序列所生成的最小值和最大值是由該序列數(shù)據類型的取值范圍來界定的。例如,INTEGER類型的序列值必須處在-2,147,483,647到2,147,483,647之間的范圍內。在DB2SQLReferenceGuide中可以找到所有數(shù)字數(shù)據類型的取值范圍。為了改變這種缺省行為,可以使用MINVALUE和MAXVALUE選項來為生成的值設置一個邊界。如果到達了最小值或最大值,那么可以使用另一個選項,即CYCLE或NOCYCLE來規(guī)定序列值是否應該循環(huán)。注意,如果CYCLE生效,則序列就可以生成重復的值。CACHE選項允許DB2將一些預先分配好空間的值保存在內存中,以提高性能。CACHE20是缺省的行為。關于這個選項有一點要謹記:如果在所有緩存的值被使用之前關閉DB2,那么任何緩存的值和未使用的值都將被丟棄。當DB2重新啟動時,又會生成和緩存下一塊的值,從而造成值之間的不連續(xù),即值之間存在間隔。如果應用程序不允許值之間有間隔,可以考慮使用NOCACHE選項。如果沒有使用緩存,則性能就會下降,因為要頻繁地生成序列數(shù)字。每當生成一個新值的時候,都會寫下一條日志記錄。因此,更高效的做法是根據請求來獲取值,并將這些值緩存在內存中。通過ALTERSEQUENCE語句,可以更改序列對象的特征。除了序列值的數(shù)據類型以外,上面所討論的所有的設置都可以修改。要獲得完整的語法,請參考DB2SQLReferenceGuide(請參閱參考資料)。刪除一個序列對象與刪除任何其他的數(shù)據庫對象是一樣的,不同之處是這里還要使用到一個RESTRICT關鍵字。這樣可以防止在有依賴的情況下刪除序列。DROPSEQUENCEmyseqRESTRICT生成和獲取序列值序列是一種數(shù)據庫對象,因此對序列的訪問也是由權限來控制的。缺省情況下,只有序列的創(chuàng)立者,即SYSADM和DBADM擁有該對象的USAGE權限。如果希望其他用戶也能夠使用序列,則需要使用下面的語句:GRANTUSAGEONSEQUENCEseq_object_nameTOPUBLIC有兩種表達式可用于生成和獲取序列值。NEXTVALFORseq-name用于獲取下一個序列值,而PREVVALFORseq-name則用于獲取上一個生成的序列值。下面的例子例釋了這些表達式的使用。INSERTINTOt1VALUES(NEXTVALFORmyseq,'BOB');INSERTINTOt1VALUES(NEXTVALFORmyseq,'PAT');COMMIT;INSERTINTOt1VALUES(NEXTVALFORmyseq,'GENE');ROLLBACK;INSERTINTOt1VALUES(NEXTVALFORmyseq,'PAUL');VALUESPREVVALFORmyseqINTO:hostvar假設我們以一個空表t1開始,myseq的下一個序列值是1。如果禁用了autocommit,則在執(zhí)行上述語句之后,t1將包含下面幾行:1 NAME 1 BOB2 PAT4 PAUL 3record(s)selected.雖然為GENE生成的值被回滾了,但是DB2并沒有再次使用它。因而,下一個為PAUL生成的序列值就是4,而不是3。這個例子中的最后一條語句展示了如何使用PREVVAL表達式。宿主變量:hostvar存儲當前會話中生成的最后一個值。如果想保存前面生成的值,那么應該在生成下一個值之前保存PREVVAL值。臨時表顧名思義,臨時表(temporarytable)不是永久性的數(shù)據庫對象。臨時表與普通的表在行為上是一樣的,不同之處是,并非所有的功能和選項都是受支持的和/或是必需的。臨時表只能維持在一次連接期間。當連接關閉時,在此連接內聲明的所有臨時表都將自動刪除掉。只有聲明臨時表的會話或應用程序才能訪問臨時表。如果兩個應用程序用相同的名字創(chuàng)立了一個臨時表,該臨時表的每個實例仍然是惟一的。因而,完全不必擔憂出現(xiàn)臨時數(shù)據沖突的情況。由于臨時表只允許單連接(single-connection)訪問,因此這里無需使用鎖。這正是臨時表的一個主要的性能優(yōu)勢。聲明臨時表要聲明一個臨時表,必須存在一個USER臨時表空間(不同于SYSTEM臨時表空間),用以存儲臨時表的定義和內容。SYSTEM臨時表空間只是DB2在內部用來執(zhí)行諸如排序之類操作的。下面這條簡單的語句將創(chuàng)立一個用戶臨時表空間。CREATEUSERTEMPORARYTABLESPACEusertempspaceMANAGEDBYSYSTEMUSING('usertempspace')聲明全局臨時表時,可以使用很多可選子句。下面的例子對這些子句的特性作了說明。DECLAREGLOBALTEMPORARYTABLEt_dept(deptidCHAR(6),deptnameCHAR(20))ONCOMMITDELETEROWSNOTLOGGEDINusertempspace在這個例子中,聲明了臨時表t_dept,這個表有兩列。ONCOMMITDELETEROWS子句規(guī)定在每次執(zhí)行COMMIT操作時刪除臨時表的內容。在DB2V8中,可以選擇記錄對臨時表的更改,以便回滾。這個例子規(guī)定對該表的更改是NOTLOGGED。這意味著對該表的任何操作,包括創(chuàng)立以及更改,都不做日志記錄。如果在一個工作單位內創(chuàng)立表,然后回滾,則臨時表將被刪除。另一方面,如果在此工作單位內刪除該表,則該表在恢復時將沒有任何行。無需使用IN子句來指定該臨時表將要使用的用戶臨時表空間。如果沒有指定該信息,DB2就會搜索最適用的表空間。如果找不到用戶臨時表空間,DB2將產生一個錯誤。讓我們看看另一個例子:DECLAREGLOBALTEMPORARYTABLEt_projLIKEprojectONCOMMITPRESERVEROWSWITHREPLACEINusertempspace臨時表t_proj是用LIKE關鍵字聲明的,因此它擁有與名為project的持久表或視圖相同的列定義。ONCOMMITPRESERVEROWS子句說明,在執(zhí)行COMMIT語句時,該臨時表中的所有行都將被保存。因此,這些行就可以在下一次事務中用于進一步的處理。在同一次會話中使用相同的名稱聲明另一個臨時表之前,首先必須刪除該臨時表??梢燥@式地刪除該表,也可以像這里一樣使用WITHREPLACE選項。如果使用了WITHREPLACE選項,DB2將隱式地刪除所有數(shù)據,刪除該臨時表,并用新的定義重新創(chuàng)立該臨時表。如果使用了連接池(connectionpooling),WITHREPLACE選項用起來就十分方便了。連接池是用于重用數(shù)據庫連接的一種機制,這樣就不必完全按照要求分配和回收資源。這些操作的開銷都是相當大的,尤其是在有大量執(zhí)行很短事務的連接時,更是如此。由于沒有釋放連接,先前使用的臨時表就可能得不到去除。下一個使用該連接的應用程序就可能使用上一次執(zhí)行時遺留下來的數(shù)據。因此,使用WITHREPLACE選項可以保證用新的定義刷新所聲明的臨時表。模式與數(shù)據庫對象大多數(shù)數(shù)據庫對象都是用一個模式(schema)和一個對象名(objectname)標識的。數(shù)據庫模式為數(shù)據庫對象提供邏輯上的分類。下面例釋了這種分為兩局部的對象名:DB2ADMIN.EMPLOYEEHRPROD.AUDIT_VIEWHRPROD.AUDIT_TRIG 如果在訪問數(shù)據庫對象時沒有指定模式,則用于建立數(shù)據庫連接的用戶ID將被設為缺省的模式。例如,如果用戶db2admin連接到一個數(shù)據庫,并創(chuàng)立表T1,則DB2將創(chuàng)立一個名為db2admin.T1的表。此后所有引用非全限定(unqualified)表名T1的SQL語句都解析為db2admin.T1。DB2專用存放器:CURRENTSCHEMA您在進行自己的數(shù)據庫工作時可能已經發(fā)現(xiàn),用同為對象的模式的用戶ID連接到一個數(shù)據庫并非總是可行的。而硬編碼(hard-coding)應用程序以完全限定對象也不是最好的解決方法。幸運的是,DB2允許使用SETCURRENTSCHEMA命令更改當前模式。缺省情況下,CURRENTSCHEMADB2專用存放器被設置為連接到數(shù)據庫的USER。如果更改CURRENTSCHEMA,那么任何非全限定的數(shù)據庫對象都會在前面加上新的值。當前模式可以通過下面這個命令獲得:VALUESCURRENTSCHEMA要對它進行更改,只需使用下面的命令:SETSCHEMA=db2adminDB2應用程序開發(fā)數(shù)據庫對象例程在本節(jié)中,我們將介紹更多類型的數(shù)據庫對象。這些對象統(tǒng)統(tǒng)都叫做例程(routine)。從功能上分,主要有三種例程:存儲過程(storedprocedure)、函數(shù)(function)和方法(method)。(要了解這些類型之間的更多不同之處,請參閱存儲過程、函數(shù)和方法。)例程是封裝了與某一特定任務相關的編程和數(shù)據庫邏輯的數(shù)據庫對象。有效地使用例程可以簡化應用程序的代碼,并增加代碼的可重用性。例如,如果將某種業(yè)務邏輯封裝在一個例程中,那么對此業(yè)務規(guī)則的更改只會影響那個特定的例程。從而可最小化對應用程序的更改。例程是在數(shù)據庫效勞器上定義和處理的。這樣就允許應用程序利用數(shù)據庫效勞器的能力,從而減少客戶機上的處理負載。通常,復雜的業(yè)務邏輯需要多條SQL語句。這些語句要分別地從客戶機發(fā)送到效勞器,如果數(shù)據庫活動很多,就會產生大量的網絡傳輸。如果將這些操作放在一個例程中,那么客戶機和效勞器之間的網絡傳輸就會大大減少,從而可以提高應用程序的總體性能。加強平安的能力是使用例程的另一個關鍵優(yōu)勢。例程可用于屏蔽對底層數(shù)據庫對象的直接訪問。用EXECUTE權限調用一個例程就足夠了,無需擁有訪問底層數(shù)據庫對象的顯式的權限。例程的不同實現(xiàn)例程有幾種可能的實現(xiàn):內置(built-in)例程是DB2系統(tǒng)附帶的。這些例程定義在一個系統(tǒng)模式中,例如SYSIBM、SYSPROC、SYSFUN和SYSTOOLS。Sourced例程只適用于函數(shù)。sourced例程復制另一個函數(shù)的語義。外部(external)例程是用一種外部的編程語言實現(xiàn)的。對于DB2V8.1,可以用以下受支持的語言開發(fā)例程:Java語言C/C++OLE(僅用于存儲過程)OLEDB(僅用于表函數(shù))SQL例程是用SQLProceduralLanguage(SQLPL)實現(xiàn)的。DB2SQLPL是SQLPersistentStoredModules(SQL/PSM)語言標準的一個子集。該標準是與SQL一起用來編寫存儲過程、函數(shù)和方法的結構化編程語言的基礎。它將SQL數(shù)據訪問的容易性與簡單編程語言的流控制結構相結合。這就是SQLPL如此流行的一個主要原因。存儲過程、函數(shù)和方法存儲過程是一種數(shù)據庫對象,它包含用于訪問和修改一個或多個表中數(shù)據的專門程序。在一個存儲過程內,可以以一定的流邏輯包裝多條SQL語句。存儲過程可以作為對客戶機應用程序或其他例程的子例程擴展。存儲過程的執(zhí)行和管理是由一個關系數(shù)據庫管理系統(tǒng)(RDBMS)控制的。函數(shù)是可以自定義的SQL擴展??梢栽赟QL語句(例如一個select-list或FROM子句)中調用函數(shù)。有四種類型的函數(shù):聚合(aggregate)函數(shù)、標量(scalar)函數(shù)、行(row)函數(shù)以及表(table)函數(shù)。存儲過程通常用于封裝復雜的應用程序邏輯,以及執(zhí)行開銷較大的數(shù)據庫操作,例如多表聯(lián)結和游標操作。而函數(shù)――尤其是SQL函數(shù)――通常包含更簡單的操作。編寫在SQL函數(shù)中的語句將展開到引用它們的SQL語句中,與這些SQL語句一起執(zhí)行。這導致這些語句在執(zhí)行時動態(tài)編譯。如果一條SQL語句中使用了一個復雜的SQL函數(shù),則DB2要求使用附加的資源來編譯它,并生成一個數(shù)據訪問方案。這樣將影響整個運行時性能。方法用于封裝為結構類型提供行為的邏輯,結構類型包含一個或多個指定的屬性,各屬性有其自己的數(shù)據類型。DB2專用存放器:CURRENTPATH與大多數(shù)DB2數(shù)據庫對象一樣,一個完整的例程名由一個模式和一個例程名組成。DB2專用存放器CURRENTSCHEMA可以為大多數(shù)數(shù)據庫對象解析模式,但不能為例程解析模式。相反,DB2是使用CURRENTPATH專用存放器來定位例程的。通過下面的命令可以獲得CURRENTPATH設置:VALUESCURRENTPATH缺省路徑包含三個系統(tǒng)模式,后面跟有連接到數(shù)據庫的當前用戶。例如:"SYSIBM","SYSFUN","SYSPROC","DB2ADMIN"下面是一些例子和技巧,您可以用它們來更新PATH:SETPATH=CURRENTPATH,"USER2"VALUESCURRENTPATH"SYSIBM","SYSFUN","SYSPROC","DB2ADMIN","USER2"1record(s)selected.嵌入式SQL程序嵌入式SQL簡介DB2為開發(fā)人員提供了不同的編程方法來編寫應用程序。最直接的一種方法是嵌入式SQL編程。這種編程方法是直接的,因為程序嵌入了直接與DB2交互的SQL語句。程序可以用以下受支持的編程語言中的任何一種來編寫:C/C++FORTRANCOBOLJava語言(SQLJ)如何構造嵌入式SQL語句取決于所選擇的編程語言。C/C++和FORTRAN中的嵌入式SQL語句前面要加上EXECSQL關鍵字:EXECSQLSELECTlastname,empidINTO:hostvar1,:hostvar2 FROMemployeeWHEREdeptno="OPERATIONS";COBOL中的嵌入式SQL語句非常類似于C/C++中的那些嵌入式SQL語句,不同的是在語句的后面要使用END-EXEC關鍵字:EXECSQLSELECTlastname,empidINTO:hostvar1,:hostvar2FROMemployeeWHEREdeptno="OPERATIONS"END-EXEC;Java語言中的嵌入式SQL語句與前面兩個例子中展示的那些嵌入式SQL語句稍微有些不同,這里必須指定語句將來執(zhí)行時所在的連接上下文。下面是一個例子:#sql[myConnCtx]{SELECTlastname,empidINTO:hostvar1,:hostvar2FROMemployeeWHEREdeptno="OPERATIONS"};為了讓您更好地了解嵌入式SQL語句是什么樣子的,下面給出了用C編寫的一個程序的代碼片斷。在本系列(請參閱參考資料)的第3篇教程中,您將了解到更多關于程序預編譯和實際代碼開發(fā)的知識。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é)中,我們演示了兩種不同類型的嵌入式SQL語句:靜態(tài)嵌入式SQL和動態(tài)嵌入式SQL。這個例子中的SELECT語句說明了靜態(tài)SQL的使用。編寫靜態(tài)SQL時,必須指定完整的語句。表名、列名以及所引用的數(shù)據類型都是的。惟一可以在運行時指定的信息是使用宿主變量的SQL語句的WHERE子句中的值。編譯靜態(tài)SQL語句(或者,用DB2術語更確切地說,準備好的(prepared)SQL語句)時,將為其生成數(shù)據訪問方案,并存儲在數(shù)據庫中的一個包里面。當調用包含該語句的應用程序時,這個包將被執(zhí)行。由于在運行時不需要編譯語句,因此執(zhí)行靜態(tài)SQL時沒用編譯開銷。在準備語句時,DB2使用數(shù)據庫統(tǒng)計信息和配置參數(shù)來估計和獲得訪問方案。如果數(shù)據庫統(tǒng)計信息有變化,則預先生成的訪問方案可能不如一開始生成時那樣是最正確的。創(chuàng)立包和將包與數(shù)據庫綁定時,要對準備靜態(tài)SQL語句的人進行授權。只要執(zhí)行包的人擁有包的EXECUTE權限,他就不需要具備該包中所引用的數(shù)據庫對象上的顯式的權限。動態(tài)SQL動態(tài)(DynamicSQL)語句是在運行時動態(tài)處理的。語句的結構直到執(zhí)行應用程序時才需要。注意,嵌入式SQL簡介中展示的例子SQL語句使用動態(tài)SQL來PREPARE和EXECUTE一條DELETE語句。DELETE語句的文本存儲在一個宿主變量hostVarStmt中。當該語句PREPARE好后,系統(tǒng)將生成該語句的一個可執(zhí)行格式,并將其存儲在數(shù)據庫中的一個包里面。一旦生成了數(shù)據訪問方案,準備好的語句就可以EXECUTE了。聽起來好似有點熟悉,不是嗎?是的:這兩個處理階段與靜態(tài)SQL語句正好是一樣的。惟一的不同點是,動態(tài)SQL的PREPARE和EXECUTE都是在運行時進行,而靜態(tài)SQL在預編譯時準備訪問方案,并將其保存在數(shù)據庫中。動態(tài)SQL語句必須總是在執(zhí)行之前準備好,不管是否有相同的語句(相同的訪問方案)一次又一次地重復使用。為了最小化這些準備工作的開銷,DB2提供了包緩存(也叫動態(tài)查詢緩存),用以將經常使用的訪問方案保存在內存中。包緩存(packagecache)明顯地減少了重復的SQL準備請求的代價,然而發(fā)起和響應準備請求的開銷仍然存在。在準備語句時,總是使用當前數(shù)據庫統(tǒng)計信息。因此,就可以生成最正確的數(shù)據訪問路徑。SQL語句的授權是在運行時決定的。執(zhí)行應用程序的人必須有適當?shù)臋嘞迊碓L問語句中所引用的數(shù)據庫對象。下一小節(jié)將更詳細地討論DB2權限。平安考慮要預編譯嵌入式靜態(tài)SQL程序,用戶需要程序中所引用數(shù)據庫對象的顯式的權限。由于預編譯或PREPARE階段會生成一個包,并將其存儲在數(shù)據庫中,因此該用戶還必須擁有BINDADD權限,以便添加新的包到數(shù)據庫中。為了執(zhí)行帶有靜態(tài)SQL的程序,用戶只需具有相關包上的EXECUTE權限。編譯嵌入式動態(tài)SQL程序的用戶也需要BINDADD權限。這里不再需求其他的權限,因為動態(tài)SQL不是在編譯時準備的。在程序執(zhí)行時,用戶需要所有必需的權限來發(fā)出每條SQL語句,同時還需要為嵌入式SQL程序創(chuàng)立的包上的EXECUTE權限。下面的表總結了預編譯和執(zhí)行一個只有靜態(tài)SQL或只有動態(tài)SQL的程序所需的權限。靜態(tài)SQL與動態(tài)SQL在下面的表中,讓我們總結并詳細闡述我們所學到的關于靜態(tài)SQL和動態(tài)SQL的知識:基于驅動程序的API基于驅動程序的API雖然大多數(shù)供給商都支持嵌入式SQL數(shù)據庫訪問,但如果您想要使用同樣的源代碼,并將嵌入式SQL應用程序部署到多個數(shù)據庫系統(tǒng)上,那么還需要一個額外的工作。必須用不同供給商的特定的預編譯器預編譯程序。還必須生成數(shù)據訪問方案,并綁定到目標數(shù)據庫。為了增加應用程序的可移植性,還應考慮使用本節(jié)介紹的基于驅動程序的解決方案?;隍寗映绦虻慕鉀Q方案需要一個驅動程序管理器(drivermanager),這是與應用程序打交道的界面。驅動程序管理器提供了一套工業(yè)標準的應用程序編程接口(API),用于訪問數(shù)據源。應用程序調用這些API,然后被編譯,再與管理器的庫鏈接。因為驅動程序遵從標準,所以應用程序可以很容易地使用(或裝載)正確的驅動程序來訪問不同供給商的數(shù)據源。在下面幾小節(jié)中,我們將看看DB2支持的一些API。在本系列后面的教程中,您將更詳細地了解這些API。CLI和ODBCAPIDB2CallLevelInterface(CLI)是IBM對DB2數(shù)據庫效勞器的可調用SQL接口。CLI是用于數(shù)據訪問的一個C/C++應用程序編程接口(API)。您可以使用DB2CLI開發(fā)動態(tài)應用程序,就像使用嵌入式動態(tài)SQL語句進行開發(fā)一樣。在這兩種情況下,SQL語句都是在運行時準備和處理的。嵌入式動態(tài)SQL要求有一個預編譯器,而DB2CLI則沒有這種要求。您只需編譯應用程序,并與DB2CLI驅動程序庫鏈接。DB2CLI是基于MicrosoftOpenDatabaseConnectivity(ODBC)和X/OpenCLI標準的。在ODBC環(huán)境中,應用程序與數(shù)據庫效勞器之間的聯(lián)系要通過ODBC驅動程序管理器。該管理器動態(tài)地加載應用程序需連接的數(shù)據庫效勞器所需的驅動程序。ODBC提供某些級別的功能支持,當前的DB2CLI遵從ODBC3.51。要開發(fā)DB2CLI應用程序,需要DB2ApplicationDevelopmentClient。它包括編譯和鏈接CLI應用程序時所有必需的頭文件和庫。而要開發(fā)ODBC應用程序,則需要Microsoft提供的一個ODBCDeveloper'sSoftwareKit。下面的圖對DB2CLI與ODBC環(huán)境作了快速的比較。OLEDB與ADO.NETAPIMicrosoftObjectLinkEmbeddedDatabase(OLEDB)是一套接口,它為應用程序提供了對存儲在不同信息源上的數(shù)據的統(tǒng)一訪問,這些不同的信息源包括關系數(shù)據源和非關系數(shù)據源。OLEDB架構由OLEDB提供者和OLEDB消費者組成。DB2同時支持這兩種角色。為了使DB2能夠充當OLEDB提供者,必須要有IBMOLEDBProviderforDB2。這是一個本地驅動程序,支持通過OLE接口提取或查詢DB2數(shù)據。下面的圖展示了一個可作為OLEDB消費者的DB2數(shù)據庫,它可以訪問來自任何遵從OLEDB的數(shù)據源(例如一個電子表格)的數(shù)據。同樣的DB2效勞器也可以作為一個OLEDB提供者,為OLEDB消費者提供數(shù)據。ActiveXDataObject.NET(ADO.NET)是Microsoft提供的另一種數(shù)據訪問應用程序接口。它是一種新的數(shù)據訪問模型,將其前任(ADO)最好的特性與傳統(tǒng)的數(shù)據庫訪問相結合,集成了XML支持,是一種斷開連接的(disconnected)數(shù)據架構。有三種方法從一個.NET應用程序連接到一個DB2數(shù)據庫,如以下圖所示。JDBC和SQLJAPI至今為止,Java平臺已經享譽多時,但仍有很多人正在致力于擴展其功能和提高其性能。訪問和操縱DB2的Java程序可以使用JavaDatabaseConnectivity(JDBC)API,以及EmbeddedSQLforJava(SQLJ)標準。這兩個選項都是供給商無關的SQL接口,通過標準化的Java方法為應用程序提供數(shù)據訪問。JDBC是用于關系數(shù)據庫訪問的實際上的標準JavaAPI,這種訪問通過強大的面向對象的接口,使用動態(tài)SQL。JDBC將動態(tài)SQL傳遞給DB2附帶的一個JDBC驅動程序。DB2通過JDBCAPI執(zhí)行SQL語句,結果被傳回給Java代碼。JDBC類似于DB2CLI,您無需預編譯或綁定JDBC程序,因為JDBC使用動態(tài)SQL。而SQLJ程序則包含靜態(tài)嵌入式SQL語句。準備一個SQLJ程序時需要通過類似于預編譯和綁定的步驟。在編譯SQLJ源文件之前,必須用SQLJ翻譯器對其進行翻譯,以創(chuàng)立本地Java源代碼。完成翻譯后,需要使用DB2forJavapro(db2profc)創(chuàng)立DB2包。DB2遺留的基于CLI的JDBC驅動程序根據Java2Platform,EnterpriseEdition(J2EE)標準,用于獲得數(shù)據訪問的Java方法和接口可以打包成JDB
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 家具設計開發(fā)合同
- 娛樂設備買賣協(xié)議
- 安全技能培訓
- 支部團員會議課件
- 執(zhí)法案卷培訓
- 實驗室管理系統(tǒng)介紹
- 阿克蘇職業(yè)技術學院《組織學與胚胎學(B)》2023-2024學年第二學期期末試卷
- 2025年小班保育員上學期工作總結模版
- 護理質控組長述職與競聘
- 陜西中醫(yī)藥大學《現(xiàn)代食品工程》2023-2024學年第一學期期末試卷
- 企業(yè)人力資源管理師(四級)教材
- 教科版六年級下冊科學第一單元測試卷(原卷版)
- 【教學課件】正確行使訴訟權利-示范課件
- 促進市級醫(yī)院臨床技能與臨床創(chuàng)新三年行動計劃
- 主觀幸福感(GWB)量表
- 臨床試驗疑難問題解答
- Word版中國空白地圖大全
- 玻璃纖維生產工藝流程培訓
- 中國神經外科重癥患者氣道管理
- 機電安裝總進計劃橫道圖
- 精美教案封面(共1頁)
評論
0/150
提交評論