DB2數據庫對象基礎知識_第1頁
DB2數據庫對象基礎知識_第2頁
DB2數據庫對象基礎知識_第3頁
DB2數據庫對象基礎知識_第4頁
DB2數據庫對象基礎知識_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、DB2數據據庫對象基本數據庫庫對象 數據庫對象象是一個數數據庫的構構造塊(bbuildding blocck)。DDB2 提提供了不同同類型的數數據庫對象象來存儲和和表示不同同信息。通通過使用數數據定義語語言(DDDL),可可以創(chuàng)建、修改和刪刪除數據庫庫對象。要要操縱數據據庫對象,可可以使用數數據操縱語語言(DMML),例例如 SEELECTT、UPDDATE、INSEERT 和和 SELLECT 語句。常常用的數據據庫對象有有:表 用戶定義數數據類型 約束 視圖 索引 除了 Faamilyy Funndameentalls 教程程里介紹的的一些數據據庫對象外外,還有一一些其他的的對象,很很多

2、開發(fā)人人員在開發(fā)發(fā) DB22 應用程程序時會發(fā)發(fā)現(xiàn)這些對對象比較有有用。本節(jié)節(jié)我們將介介紹這些對對象。在繼續(xù)之前前,有一點點要注意:在下面看看到的一些些例子中,對對象名稱是是以小寫形形式指定的的。無論 DB2 在哪個平平臺上運行行,它總是是以大寫形形式存儲名名稱,除非非標識符的的名稱以雙雙引號()括起起來了。例如,下面面的語句創(chuàng)創(chuàng)建一個名名為 emmployyee(小小寫)的表表,該表的的列定義與與表 EMMPLOYYEE(大大寫)是一一樣的。CREAATE TTABLEE emmployyee LIKEE empployeee別名 別名(allias) 是指一個個已有的表表、視圖的的另一個名

3、名稱,也叫叫昵稱(nnicknname)。別名也可可以作為另另一個別名名的昵稱。與這些對對象一樣,別別名也可以以被創(chuàng)建或或刪除,可可以有與之之相關的注注釋。下面面是 CRREATEE ALIIAS 語語句的一些些例子:CREAATE AALIASS aliiastaab1 FFOR ttab1;CREAATE AALIASS bobb.aliiastaab1 FFOR ttom.ttab1;CREAATE SSYNONNYM bbob.aaliasstab22 FORR bobb.aliiastaab1;可以看到,CCREATTE ALLIAS 語句比較較簡單。可可以在源對對象所在的的同一模式

4、式中創(chuàng)建別別名(如第第 1 行行),或者者也可以全全限定別名名(如第 2 行)。為了與 DB2 for zSerries 兼容,使使用關鍵字字 SYNNONYMM 代替 ALIAAS 也是是合法的(如如第 3 行)。使用別名時時無需專門門的授權或或權限。不不過,需要要獲得與別別名所引用用的底層對對象相關的的授權。關關于數據庫庫對象權限限的完整清清單,請參參考 DBB2 DBBA 認證證教程 SServeer maanageementt(請參閱閱 參考資資料)。前面已提到到,我們也也可以為 昵稱 創(chuàng)創(chuàng)建別名。昵稱是引引用位于聯(lián)聯(lián)邦系統(tǒng)上上的數據表表或視圖的的數據庫對對象。聯(lián)邦邦數據庫支支持超出了

5、了本教程的的范圍。在在本教程系系列的第 2 部分分,Datta maanipuulatiion ,我我們將學習習更多有關關聯(lián)邦系統(tǒng)統(tǒng)的知識。要為別名添添加注釋,可可以發(fā)出以以下語句:COMMMENT ON aaliasstab11 IS My firsst allias on ttab1要刪除一個個別名,使使用 DRROP 語語句,這與與所有其他他數據庫對對象是一樣樣的:DROPP ALIIAS aaliasstab11序列對象 序列(seequennce)是是一種數據據庫對象,這這種對象允允許自動生生成值。序序列對象與與標識列(iidenttity coluumn)不不同,標識識列是要與與一

6、個特定定的表綁在在一起的,而而序列是一一種全局的的、獨立的的對象,同同一個數據據庫中的任任何表都可可以使用它它。標識列是序序列對象的的一種特例例。因此,標標識列的特特征也適用用于序列對對象。下面面就例釋了了一條 CCREATTE SEEQUENNCE 語語句:CREAATE SSEQUEENCE myseeq ASS INTTEGERR STARRT WIITH 3360 INCRREMENNT BYY 10 NO MMAXVAALUE CYCLLE CACHHE 200 任何包括 0 在內內的數字數數據類型都都可用于序序列值。這這些類型包包括 SMMALLIINT、IINTEGGER、BBI

7、GINNT 或 DECIIMAL。基于這些些數據類型型的任何用用戶定義獨獨特類型(ddistiinct typee)也都可可以用于序序列值。這這進一步擴擴展了用戶戶定義獨特特類型在應應用程序中中的使用。 如上面的例例子所示,您您可以為序序列對象指指定起始值值,從而自自定義序列列對象。在在這個例子子中,序列列的第一個個值是 3360。后后續(xù)值的生生成是由 INCRREMENNT BYY 子句控控制的。這這里還支持持正、負常常量,以產產生升序和和降序值。 缺省情況下下,一個序序列所生成成的最小值值和最大值值是由該序序列數據類類型的取值值范圍來界界定的。例例如,INNTEGEER 類型型的序列值值必

8、須處在在 -2,147,483,647 到 2,147,483,647 之間的范范圍內。在在 DB22 SQLL Refferennce GGuidee 中可以以找到所有有數字數據據類型的取取值范圍。為了改變變這種缺省省行為,可可以使用 MINVVALUEE 和 MMAXVAALUE 選項來為為生成的值值設置一個個邊界。如如果達到了了最小值或或最大值,那那么可以使使用另一個個選項,即即 CYCCLE 或或 NO CYCLLE 來規(guī)規(guī)定序列值值是否應該該循環(huán)。注注意,如果果 CYCCLE 生生效,則序序列就可以以生成重復復的值。CACHEE 選項允允許 DBB2 將一一些預先分分配好空間間的值保

9、留留在內存中中,以提高高性能。CCACHEE 20 是缺省的的行為。關關于這個選選項有一點點要謹記:如果在所所有緩存的的值被使用用之前關閉閉 DB22,那么任任何緩存的的值和未使使用的值都都將被丟棄棄。當 DDB2 重重新啟動時時,又會生生成和緩存存下一塊的的值,從而而造成值之之間的不連連續(xù),即值值之間存在在間隔。如如果應用程程序不允許許值之間有有間隔,可可以考慮使使用 NOOCACHHE 選項項。如果沒有使使用緩存,則則性能就會會下降,因因為要頻繁繁地生成序序列數字。每當生成成一個新值值的時候,都都會寫下一一條日志記記錄。因此此,更高效效的做法是是根據請求求來獲取值值,并將這這些值緩存存在內

10、存中中。通過 ALLTER SEQUUENCEE 語句,可可以更改序序列對象的的特征。除除了序列值值的數據類類型以外,上上面所討論論的所有的的設置都可可以修改。要獲得完完整的語法法,請參考考 DB22 SQLL Refferennce GGuidee (請參參閱 參考考資料)。刪除一個序序列對象與與刪除任何何其他的數數據庫對象象是一樣的的,不同之之處是這里里還要使用用到一個 RESTTRICTT 關鍵字字。這樣可可以防止在在有依賴的的情況下刪刪除序列。DROP SEQUUENCEE mysseq RRESTRRICT生成和獲取取序列值 序列是一種種數據庫對對象,因此此對序列的的訪問也是是由權限

11、來來控制的。缺省情況況下,只有有序列的創(chuàng)創(chuàng)建者,即即 SYSSADM 和 DBBADM 擁有該對對象的 UUSAGEE 權限。如果希望望其他用戶戶也能夠使使用序列,則則需要使用用下面的語語句:GRANTT USAAGE OON SEEQUENNCE sseq_oobjecct_naame TTO PUUBLICC有兩種表達達式可用于于生成和獲獲取序列值值。NEXXTVALL FORR seqq-namme 用于于獲取下一一個序列值值,而 PPREVVVAL FFOR sseq-nname 則用于獲獲取上一個個生成的序序列值。下下面的例子子例釋了這這些表達式式的使用。INSERRT INNTO

12、tt1 VAALUESS (NEEXTVAAL FOOR myyseq, BOOB);INSERRT INNTO tt1 VAALUESS (NEEXTVAAL FOOR myyseq, PAAT);COMMIIT;INSERRT INNTO tt1 VAALUESS (NEEXTVAAL FOOR myyseq, GEENE);ROLLBBACK;INSERRT INNTO tt1 VAALUESS (NEEXTVAAL FOOR myyseq, PAAUL);VALUEES PRREVVAAL FOOR myyseq INTOO :hoostvaar假設我們以以一個空表表 t1 開始,mm

13、yseqq 的下一一個序列值值是 1。如果禁用用了 auutocoommitt,則在執(zhí)執(zhí)行上述語語句之后,tt1 將包包含下面幾幾行:1NAMME-1BOBB2PATT4PAUUL 3 reecordd(s) seleectedd.雖然為 GGENE 生成的值值被回滾了了,但是 DB2 并沒有再再次使用它它。因而,下下一個為 PAULL 生成的的序列值就就是 4,而而不是 33。 這個例子中中的最后一一條語句展展示了如何何使用 PPREVVVAL 表表達式。宿宿主變量 :hosstvarr 存儲當當前會話中中生成的最最后一個值值。如果想想保存前面面生成的值值,那么應應該在生成成下一個值值之前保

14、存存 PREEVVALL 值。臨時表 顧名思義,臨臨時表(ttempooraryy tabble)不不是永久性性的數據庫庫對象。臨臨時表與普普通的表在在行為上是是一樣的,不不同之處是是,并非所所有的功能能和選項都都是受支持持的和/或或是必需的的。臨時表表只能維持持在一次連連接期間。當連接關關閉時,在在此連接內內聲明的所所有臨時表表都將自動動刪除掉。 只有聲明臨臨時表的會會話或應用用程序才能能訪問臨時時表。如果果兩個應用用程序用相相同的名字字創(chuàng)建了一一個臨時表表,該臨時時表的每個個實例仍然然是惟一的的。因而,完完全不必擔擔心出現(xiàn)臨臨時數據沖沖突的情況況。由于臨臨時表只允允許單連接接(sinngl

15、e-connnectiion)訪訪問,因此此這里無需需使用鎖。這正是臨臨時表的一一個主要的的性能優(yōu)勢勢。聲明臨時表表 要聲明一個個臨時表,必必須存在一一個 USSER 臨臨時表空間間(不同于于 SYSSTEM 臨時表空空間),用用以存儲臨臨時表的定定義和內容容。SYSSTEM 臨時表空空間只是 DB2 在內部用用來執(zhí)行諸諸如排序之之類操作的的。下面這這條簡單的的語句將創(chuàng)創(chuàng)建一個用用戶臨時表表空間。CREATTE USSER TTEMPOORARYY TABBLESPPACE userrtemppspacce MANAAGED BY SSYSTEEM USSING (usserteempsppa

16、ce)聲明全局臨臨時表時,可可以使用很很多可選子子句。下面面的例子對對這些子句句的特性作作了說明。DECLAARE GGLOBAAL TEEMPORRARY TABLLE t_deptt ( depptid CHARR(6), depttnamee CHAAR(200) )ON COOMMITT DELLETE ROWSS NOT LLOGGEEDIN usserteempsppace在這個例子子中,聲明明了臨時表表 t_ddept,這這個表有兩兩列。ONN COMMMIT DELEETE RROWS 子句規(guī)定定在每次執(zhí)執(zhí)行 COOMMITT 操作時時刪除臨時時表的內容容。在 DDB2 VV8

17、 中,可可以選擇記記錄對臨時時表的更改改,以便回回滾。這個個例子規(guī)定定對該表的的更改是 NOT LOGGGED。這這意味著對對該表的任任何操作,包包括創(chuàng)建以以及更改,都都不做日志志記錄。如如果在一個個工作單位位內創(chuàng)建表表,然后回回滾,則臨臨時表將被被刪除。另另一方面,如如果在此工工作單位內內刪除該表表,則該表表在恢復時時將沒有任任何行。無需使用 IN 子子句來指定定該臨時表表將要使用用的用戶臨臨時表空間間。如果沒沒有指定該該信息,DDB2 就就會搜索最最適用的表表空間。如如果找不到到用戶臨時時表空間,DDB2 將將產生一個個錯誤。讓我們看看看另一個例例子:DECLAARE GGLOBAAL T

18、EEMPORRARY TABLLE t_projj LLIKE projject OON COOMMITT PREESERVVE ROOWS WWITH REPLLACE IIN usserteempsppace臨時表 tt_prooj 是用用 LIKKE 關鍵鍵字聲明的的,因此它它擁有與名名為 prrojecct 的持持久表或視視圖相同的的列定義。ON CCOMMIIT PRRESERRVE RROWS 子句表明明,在執(zhí)行行 COMMMIT 語句時,該該臨時表中中的所有行行都將被保保留。因此此,這些行行就可以在在下一次事事務中用于于進一步的的處理。在同一次會會話中使用用相同的名名稱聲明另另一

19、個臨時時表之前,首首先必須刪刪除該臨時時表??梢砸燥@式地刪刪除該表,也也可以像這這里一樣使使用 WIITH RREPLAACE 選選項。如果果使用了 WITHH REPPLACEE 選項,DDB2 將將隱式地刪刪除所有數數據,刪除除該臨時表表,并用新新的定義重重新創(chuàng)建該該臨時表。如果使用了了 連接池池(connnecttion poolling),WWITH REPLLACE 選項用起起來就十分分方便了。連接池是是用于重用用數據庫連連接的一種種機制,這這樣就不必必完全按照照要求分配配和回收資資源。這些些操作的開開銷都是相相當大的,尤尤其是在有有大量執(zhí)行行很短事務務的連接時時,更是如如此。由于于

20、沒有釋放放連接,先先前使用的的臨時表就就可能得不不到清除。下一個使使用該連接接的應用程程序就可能能使用上一一次執(zhí)行時時遺留下來來的數據。因此,使使用 WIITH RREPLAACE 選選項可以保保證用新的的定義刷新新所聲明的的臨時表。模式與數據據庫對象 大多數數據據庫對象都都是用一個個 模式(sschemma) 和和一個 對對象名(oobjecct naame)標標識的。數數據庫模式式為數據庫庫對象提供供邏輯上的的分類。下下面例釋了了這種分為為兩部分的的對象名:DB2ADDMIN.EMPLLOYEEEHRPROOD.AUUDIT_VIEWWHRPROOD.AUUDIT_TRIGG如果在訪問問數

21、據庫對對象時沒有有指定模式式,則用于于建立數據據庫連接的的用戶 IID 將被被設為缺省省的模式。例如,如如果用戶 db2aadminn 連接到到一個數據據庫,并創(chuàng)創(chuàng)建表 TT1,則 DB2 將創(chuàng)建一一個名為 db2aadminn.T1 的表。此此后所有引引用非全限限定(unnquallifieed)表名名 T1 的 SQQL 語句句都解析為為 db22admiin.T11。DB2 專專用寄存器器:CURRRENTT SCHHEMA 您在進行自自己的數據據庫工作時時可能已經經發(fā)現(xiàn),用用同為對象象的模式的的用戶 IID 連接接到一個數數據庫并非非總是可行行的。而硬硬編碼(hhard-codiing

22、)應應用程序以以完全限定定對象也不不是最好的的解決辦法法。幸運的的是,DBB2 允許許使用 SSET CCURREENT SSCHEMMA 命令令更改當前前模式。缺缺省情況下下,CURRRENTT SCHHEMA DB2 專用寄存存器被設置置為連接到到數據庫的的 USEER。如果果更改 CCURREENT SSCHEMMA,那么么任何非全全限定的數數據庫對象象都會在前前面加上新新的值。當前模式可可以通過下下面這個命命令獲得:VALUEES CUURRENNT SCCHEMAA要對它進行行更改,只只需使用下下面的命令令:SET SSCHEMMA=dbb2admminDB2應用用程序開發(fā)發(fā)數據庫對

23、對象例程 在本節(jié)中,我我們將介紹紹更多類型型的數據庫庫對象。這這些對象統(tǒng)統(tǒng)統(tǒng)都叫做做 例程(rroutiine)。從功能上上分,主要要有三種例例程:存儲儲過程(sstoreed prroceddure)、函數(ffuncttion)和和方法(mmethood)。(要要了解這些些類型之間間的更多不不同之處,請請參閱 存存儲過程、函數和方方法。)例程是封裝裝了與某一一特定任務務相關的編編程和數據據庫邏輯的的數據庫對對象。有效效地使用例例程可以簡簡化應用程程序的代碼碼,并增加加代碼的可可重用性。例如,如如果將某種種業(yè)務邏輯輯封裝在一一個例程中中,那么對對此業(yè)務規(guī)規(guī)則的更改改只會影響響那個特定定的例程

24、。從而可最最小化對應應用程序的的更改。例程是在數數據庫服務務器上定義義和處理的的。這樣就就允許應用用程序利用用數據庫服服務器的能能力,從而而減少客戶戶機上的處處理負載。通常,復雜雜的業(yè)務邏邏輯需要多多條 SQQL 語句句。這些語語句要分別別地從客戶戶機發(fā)送到到服務器,如如果數據庫庫活動很多多,就會產產生大量的的網絡傳輸輸。如果將將這些操作作放在一個個例程中,那那么客戶機機和服務器器之間的網網絡傳輸就就會大大減減少,從而而可以提高高應用程序序的總體性性能。加強安全的的能力是使使用例程的的另一個關關鍵優(yōu)勢。例程可用用于屏蔽對對底層數據據庫對象的的直接訪問問。用 EEXECUUTE 權權限調用一一個

25、例程就就足夠了,無無需擁有訪訪問底層數數據庫對象象的顯式的的權限。例程的不同同實現(xiàn) 例程有幾種種可能的實實現(xiàn):內置(buuilt-in)例例程是 DDB2 系系統(tǒng)附帶的的。這些例例程定義在在一個系統(tǒng)統(tǒng)模式中,例例如 SYYSIBMM、SYSSPROCC、SYSSFUN 和 SYYSTOOOLS。 Sourcced 例例程只適用用于函數。sourrced 例程復制制另一個函函數的語義義。 外部(exxternnal)例例程是用一一種外部的的編程語言言實現(xiàn)的。對于 DDB2 VV8.1,可可以用下列列受支持的的語言開發(fā)發(fā)例程: Java 語言 C/C+ OLE(僅僅用于存儲儲過程) OLE DDB

26、(僅用用于表函數數) SQL 例例程是用 SQL Proccedurral LLanguuage (SQLL PL)實實現(xiàn)的。DDB2 SSQL PPL 是 SQL Perssisteent SStoreed Moodulees (SSQL/PPSM) 語言標準準的一個子子集。該標標準是與 SQL 一起用來來編寫存儲儲過程、函函數和方法法的結構化化編程語言言的基礎。它將 SSQL 數數據訪問的的容易性與與簡單編程程語言的流流控制結構構相結合。這就是 SQL PL 如如此流行的的一個主要要原因。存儲過程、函數和方方法 存儲過程 是一種數數據庫對象象,它包含含用于訪問問和修改一一個或多個個表中數據

27、據的專門程程序。在一一個存儲過過程內,可可以以一定定的流邏輯輯包裝多條條 SQLL 語句。存儲過程程可以作為為對客戶機機應用程序序或其他例例程的子例例程擴展。存儲過程程的執(zhí)行和和管理是由由一個關系系數據庫管管理系統(tǒng)(RRDBMSS)控制的的。函數 是可可以自定義義的 SQQL 擴展展??梢栽谠?SQLL 語句(例例如一個 seleect-llist 或 FRROM 子子句)中調調用函數。有四種類類型的函數數:聚合(aaggreegatee)函數、標量(sscalaar)函數數、行(rrow)函函數以及 表(taable)函函數。 存儲過程通通常用于封封裝復雜的的應用程序序邏輯,以以及執(zhí)行開開銷

28、較大的的數據庫操操作,例如如多表聯(lián)結結和游標操操作。而函函數 尤其是是 SQLL 函數 通常常包含更簡簡單的操作作。編寫在在 SQLL 函數中中的語句將將展開到引引用它們的的 SQLL 語句中中,與這些些 SQLL 語句一一起執(zhí)行。這導致這這些語句在在執(zhí)行時動動態(tài)編譯。如果一條條 SQLL 語句中中使用了一一個復雜的的 SQLL 函數,則則 DB22 要求使使用附加的的資源來編編譯它,并并生成一個個數據訪問問計劃。這這樣將影響響整個運行行時性能。 方法 用于于封裝為結結構類型提提供行為的的邏輯,結結構類型包包含一個或或多個指定定的屬性,各各屬性有其其自己的數數據類型。DB2 專專用寄存器器:C

29、URRRENTT PATTH 與大多數 DB2 數據庫對對象一樣,一一個完整的的例程名由由一個模式式和一個例例程名組成成。 DBB2 專用用寄存器 CURRRENT SCHEEMA可以以為大多數數數據庫對對象解析模模式,但不不能為例程程解析模式式。相反,DDB2 是是使用 CCURREENT PPATH 專用寄存存器來定位位例程的。通過下面的的命令可以以獲得 CCURREENT PPATH 設置:VALUEES CUURRENNT PAATH缺省路徑包包含三個系系統(tǒng)模式,后后面跟有連連接到數據據庫的當前前用戶。例例如:SYSIIBM,SYSSFUN,SYYSPROOC,DB2AADMINN下面

30、是一些些例子和技技巧,您可可以用它們們來更新 PATHH:SET PPATH=CURRRENT PATHH,USSER2VALUEES CUURRENNT PAATH-SYSIIBM,SYSSFUN,SYYSPROOC,DB2AADMINN,UUSER221 reccord(s) sseleccted.嵌入式 SSQL 程程序嵌入式 SSQL 簡簡介 DB2 為為開發(fā)人員員提供了不不同的編程程方法來編編寫應用程程序。最直直接的一種種方法是嵌嵌入式 SSQL 編編程。這種種編程方法法是 直接接的,因為為程序嵌入入了直接與與 DB22 交互的的 SQLL 語句。程序可以以用下列受受支持的編編程語言

31、中中的任何一一種來編寫寫:C/C+ FORTRRAN COBOLL Java 語言 (SSQLJ) 如何構造嵌嵌入式 SSQL 語語句取決于于所選擇的的編程語言言。C/CC+ 和和 FORRTRANN 中的嵌嵌入式 SSQL 語語句前面要要加上 EEXEC SQL 關鍵字:EXEC SQL SELEECT llastnname,empiid INNTO :hosttvar11, :hhostvvar2 FROMM empployeee WHHERE depttno=OPERRATIOONS;COBOLL 中的嵌嵌入式 SSQL 語語句非常類類似于 CC/C+ 中的那那些嵌入式式 SQLL 語句

32、,不不同的是在在語句的后后面要使用用 ENDD-EXEEC 關鍵鍵字:EXEC SQL SELEECT llastnname,empiid INNTO :hosttvar11, :hhostvvar2 FRROM eemplooyee WHERRE deeptnoo=OPPERATTIONSS ENND-EXXEC;Java 語言中的的嵌入式 SQL 語句與前前面兩個例例子中展示示的那些嵌嵌入式 SSQL 語語句稍微有有些不同,這這里必須指指定語句將將來執(zhí)行時時所在的連連接上下文文。下面是是一個例子子:#sql myCConnCCtx SELLECT lasttnamee, emmpid IN

33、TOO :hoostvaar1, :hosstvarr2 FFROM emplloyeee WHEERE ddeptnno=OOPERAATIONNS;為了讓您更更好地了解解嵌入式 SQL 語句是什什么樣子的的,下面給給出了用 C 編寫寫的一個程程序的代碼碼片斷。在在本系列(請請參閱 參參考資料)的的第 3 篇教程中中,您將了了解到更多多關于程序序預編譯和和實際代碼碼開發(fā)的知知識。int TTbBassic(vvoid) intt rc = 0; strruct sqlcca sqqlca; EXEEC SQQL BEEGIN DECLLARE SECTTION; cchar hosttVar

34、SStmt50; EEXEC SQL END DECLLARE SECTTION; /* delccare curssor */ EXEEC SQQL DEECLARRE c11 CURRSOR FOR SSELECCT deeptnuumb, depttnamee FROOM orrg WHHERE depttnumbb = 440; /* openn currsor */ EXEEC SQQL OPPEN cc1; /* fetcch cuursorr */ EXEEC SQQL FEETCH c1 IINTO :depptnummb, :depttnamee; whiile (sqlcc

35、a.sqqlcodde != 1000) pprinttf( %8d %-14ssn, depptnummb, ddeptnname); EEXEC SQL FETCCH c11 INTTO :ddeptnnumb, :deeptnaame; /* closse cuursorr */ EXEEC SQQL CLLOSE c1; /* preppare the stattemennt */ strrcpy(hosttVarSStmt, DEELETEE FROOM orrg WHHERE depttnumbb = 115); EXEEC SQQL PRREPARRE Sttmt FFROM :

36、hosstVarrStmtt; /* execcute the stattemennt */ EXEEC SQQL EXXECUTTE Sttmt; /* ROLLLBACKK thee traansacctionn */ EXEEC SQQL ROOLLBAACK; retturn 0;靜態(tài) SQQL 在前一小節(jié)節(jié)中,我們們演示了兩兩種不同類類型的嵌入入式 SQQL 語句句:靜態(tài)嵌嵌入式 SSQL 和和動態(tài)嵌入入式 SQQL。這個例子中中的 SEELECTT 語句說說明了靜態(tài)態(tài) SQLL 的使用用。編寫靜靜態(tài) SQQL 時,必必須指定完完整的語句句。表名、列名以及及所引用的的數據類型型都是已

37、知知的。惟一一可以在運運行時指定定的信息是是使用宿主主變量的 SQL 語句的 WHERRE 子句句中的值。編譯靜態(tài) SQL 語句(或或者,用 DB2 術語更確確切地說,準準備好的(pprepaared)SSQL 語語句)時,將將為其生成成數據訪問問計劃,并并存儲在數數據庫中的的一個包里里面。當調調用包含該該語句的應應用程序時時,這個包包將被執(zhí)行行。由于在在運行時不不需要編譯譯語句,因因此執(zhí)行靜靜態(tài) SQQL 時沒沒用編譯開開銷。在準備語句句時,DBB2 使用用數據庫統(tǒng)統(tǒng)計信息和和配置參數數來估計和和獲得訪問問計劃。如如果數據庫庫統(tǒng)計信息息有變化,則則預先生成成的訪問計計劃可能不不如一開始始生成

38、時那那樣是最佳佳的。創(chuàng)建包和將將包與數據據庫綁定時時,要對準準備靜態(tài) SQL 語句的人人進行授權權。只要執(zhí)執(zhí)行包的人人擁有包的的 EXEECUTEE 權限,他他就不需要要具備該包包中所引用用的數據庫庫對象上的的顯式的權權限。動態(tài) SQQL 動態(tài)(Dyynamiic SQQL) 語語句是在運運行時動態(tài)態(tài)處理的。語句的結結構直到執(zhí)執(zhí)行應用程程序時才需需要。注意,嵌入入式 SQQL 簡介介 中展示示的例子 SQL 語句使用用動態(tài) SSQL 來來 PREEPAREE 和 EEXECUUTE 一一條 DEELETEE 語句。DELEETE 語語句的文本本存儲在一一個宿主變變量 hoostVaarStmm

39、t 中。當該語句句 PREEPAREE 好后,系系統(tǒng)將生成成該語句的的一個可執(zhí)執(zhí)行格式,并并將其存儲儲在數據庫庫中的一個個包里面。一旦生成成了數據訪訪問計劃,準準備好的語語句就可以以 EXEECUTEE 了。聽聽起來好像像有點熟悉悉,不是嗎嗎?是的:這兩個處處理階段與與靜態(tài) SSQL 語語句正好是是一樣的。惟一的不不同點是,動動態(tài) SQQL 的 PREPPARE 和 EXXECUTTE 都是是在運行時時進行,而而靜態(tài) SSQL 在在預編譯時時準備訪問問計劃,并并將其保存存在數據庫庫中。動態(tài) SQQL 語句句必須總是是在執(zhí)行之之前準備好好,不管是是否有相同同的語句(相相同的訪問問計劃)一一次又一

40、次次地重復使使用。為了了最小化這這些準備工工作的開銷銷,DB22 提供了了 包緩存存(也叫 動態(tài)查詢詢緩存),用用以將經常常使用的訪訪問計劃保保存在內存存中。包緩緩存(paackagge caache)明明顯地減少少了重復的的 SQLL 準備請請求的代價價,然而發(fā)發(fā)起和響應應準備請求求的開銷仍仍然存在。在準備語句句時,總是是使用當前前數據庫統(tǒng)統(tǒng)計信息。因此,就就可以生成成最佳的數數據訪問路路徑。SQL 語語句的授權權是在運行行時決定的的。執(zhí)行應應用程序的的人必須有有適當的權權限來訪問問語句中所所引用的數數據庫對象象。下一小小節(jié)將更詳詳細地討論論 DB22 權限。安全考慮 要預編譯嵌嵌入式靜態(tài)態(tài)

41、 SQLL 程序,用用戶需要程程序中所引引用數據庫庫對象的顯顯式的權限限。由于預預編譯或 PREPPARE 階段會生生成一個包包,并將其其存儲在數數據庫中,因因此該用戶戶還必須擁擁有 BIINDADDD 權限限,以便添添加新的包包到數據庫庫中。為了了執(zhí)行帶有有靜態(tài) SSQL 的的程序,用用戶只需具具有相關包包上的 EEXECUUTE 權權限。編譯嵌入式式動態(tài) SSQL 程程序的用戶戶也需要 BINDDADD 權限。這這里不再需需求其他的的權限,因因為動態(tài) SQL 不是在編編譯時準備備的。在程程序執(zhí)行時時,用戶需需要所有必必需的權限限來發(fā)出每每條 SQQL 語句句,同時還還需要為嵌嵌入式 SSQ

42、L 程程序創(chuàng)建的的包上的 EXECCUTE 權限。下面的表總總結了預編編譯和執(zhí)行行一個只有有靜態(tài) SSQL 或或只有動態(tài)態(tài) SQLL 的程序序所需的權權限。 靜態(tài) SQQL 與動動態(tài) SQQL在下面的表表中,讓我我們總結并并詳細闡述述我們所學學到的關于于靜態(tài) SSQL 和和動態(tài) SSQL 的的知識:基于驅動程程序的 AAPI基于驅動程程序的 AAPI雖然大多數數供應商都都支持嵌入入式 SQQL 數據據庫訪問,但但如果您想想要使用同同樣的源代代碼,并將將嵌入式 SQL 應用程序序部署到多多個數據庫庫系統(tǒng)上,那那么還需要要一個額外外的工作。必須用不不同供應商商的特定的的預編譯器器預編譯程程序。還必

43、必須生成數數據訪問計計劃,并綁綁定到目標標數據庫。為了增加加應用程序序的可移植植性,還應應考慮使用用本節(jié)介紹紹的 基于于驅動程序序的解決方方案?;隍寗映坛绦虻慕鉀Q決方案需要要一個驅動動程序管理理器(drriverr mannagerr),這是是與應用程程序打交道道的界面。驅動程序序管理器提提供了一套套工業(yè)標準準的應用程程序編程接接口(APPI),用用于訪問數數據源。應應用程序調調用這些 API,然然后被編譯譯,再與管管理器的庫庫鏈接。因因為驅動程程序遵從標標準,所以以應用程序序可以很容容易地使用用(或裝載載)正確的的驅動程序序來訪問不不同供應商商的數據源源。 在下面幾小小節(jié)中,我我們將看看看

44、 DB22 支持的的一些 AAPI。在在本系列后后面的教程程中,您將將更詳細地地了解這些些 APII。CLI 和和 ODBBC APPI DB2 CCall Leveel Innterfface (CLII) 是 IBM 對 DBB2 數據據庫服務器器的可調用用 SQLL 接口。CLI 是用于數數據訪問的的一個 CC/C+ 應用程程序編程接接口(APPI)。您您可以使用用 DB22 CLII 開發(fā)動動態(tài)應用程程序,就像像使用嵌入入式動態(tài) SQL 語句進行行開發(fā)一樣樣。在這兩兩種情況下下,SQLL 語句都都是在運行行時準備和和處理的。嵌入式動動態(tài) SQQL 要求求有一個預預編譯器,而而 DB22

45、 CLII 則沒有有這種要求求。您只需需編譯應用用程序,并并與 DBB2 CLLI 驅動動程序庫鏈鏈接。DB2 CCLI 是是基于 MMicroosoftt Opeen Daatabaase CConneectivvity (ODBBC) 和和 X/OOpen CLI 標準的。在 ODDBC 環(huán)環(huán)境中,應應用程序與與數據庫服服務器之間間的聯(lián)系要要通過 OODBC 驅動程序序管理器。該管理器器動態(tài)地加加載應用程程序需連接接的數據庫庫服務器所所需的驅動動程序。OODBC 提供某些些級別的功功能支持,當當前的 DDB2 CCLI 遵遵從 ODDBC 33.51。要開發(fā) DDB2 CCLI 應應用程序

46、,需需要 DBB2 Apppliccatioon Deeveloopmennt Cllientt。它包括括編譯和鏈鏈接 CLLI 應用用程序時所所有必需的的頭文件和和庫。而要要開發(fā) OODBC 應用程序序,則需要要 Miccrosooft 提提供的一個個 ODBBC Deeveloopers Sooftwaare KKit。下面的圖對對 DB22 CLII 與 OODBC 環(huán)境作了了快速的比比較。OLE DDB 與 ADO.NET API Microosoftt Objject Linkk Embbeddeed Daatabaase (OLE DB) 是一套接接口,它為為應用程序序提供了對對存

47、儲在不不同信息源源上的數據據的統(tǒng)一訪訪問,這些些不同的信信息源包括括關系數據據源和非關關系數據源源。OLEE DB 架構由 OLE DB 提提供者和 OLE DB 消消費者組成成。DB22 同時支支持這兩種種角色。為為了使 DDB2 能能夠充當 OLE DB 提提供者,必必須要有 IBM OLE DB PProviider for DB2。這是一個個本地驅動動程序,支支持通過 OLE 接口提取取或查詢 DB2 數據。下面的圖展展示了一個個可作為 OLE DB 消消費者的 DB2 數據庫,它它可以訪問問來自任何何遵從 OOLE DDB 的數數據源(例例如一個電電子表格)的的數據。同同樣的 DDB

48、2 服服務器也可可以作為一一個 OLLE DBB 提供者者,為 OOLE DDB 消費費者提供數數據。ActivveX DData Objeect .NET (ADOO.NETT) 是 Micrrosofft 提供供的另一種種數據訪問問應用程序序接口。它它是一種新新的數據訪訪問模型,將將其前任(AADO)最最好的特性性與傳統(tǒng)的的數據庫訪訪問相結合合,集成了了 XMLL 支持,是是一種斷開開連接的(ddiscoonneccted)數數據架構。有三種方方法從一個個 .NEET 應用用程序連接接到一個 DB2 數據庫,如如下圖所示示。 JDBC 和 SQQLJ AAPI 至今為止,JJava 平臺已

49、經經享譽多時時,但仍有有很多人正正在致力于于擴展其功功能和提高高其性能。訪問和操操縱 DBB2 的 Javaa 程序可可以使用 Javaa Dattabasse Coonnecctiviity (JDBCC) APPI,以及及 Embbeddeed SQQL foor Jaava (SQLJJ) 標準準。這兩個個選項都是是供應商無無關的 SSQL 接接口,通過過標準化的的 Javva 方法法為應用程程序提供數數據訪問。JDBC 是用于關關系數據庫庫訪問的 實際上的的 標準 Javaa APII,這種訪訪問通過強強大的面向向對象的接接口,使用用動態(tài) SSQL。JJDBC 將動態(tài) SQL 傳遞給

50、DB2 附帶的一一個 JDDBC 驅驅動程序。DB2 通過 JJDBC API 執(zhí)行 SSQL 語語句,結果果被傳回給給 Javva 代碼碼。JDBBC 類似似于 DBB2 CLLI,您無無需預編譯譯或綁定 JDBCC 程序,因因為 JDDBC 使使用動態(tài) SQL。而 SQLLJ 程序序則包含靜靜態(tài)嵌入式式 SQLL 語句。準備一個個 SQLLJ 程序序時需要通通過類似于于預編譯和和綁定的步步驟。在編編譯 SQQLJ 源源文件之前前,必須用用 SQLLJ 翻譯譯器對其進進行翻譯,以以創(chuàng)建本地地 Javva 源代代碼。完成成翻譯后,需需要使用 DB2 for Javaa proofilee cusstomiizer (db22proffc) 創(chuàng)創(chuàng)建 DBB2 包。DB2 遺遺留的基于于CLI 的 JDDBC 驅驅動程序 根據 Jaava 22 Plaatforrm, EEnterrprisse Edditioon (JJ2EE) 規(guī)范,用用于獲得數數據訪問的的 Javva 方法法和接口可可以打包成成 JDBBC 驅動動程序。DDB2 JJDBC 驅

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論