DB2數(shù)據(jù)庫(kù)對(duì)象基礎(chǔ)知識(shí)_第1頁(yè)
DB2數(shù)據(jù)庫(kù)對(duì)象基礎(chǔ)知識(shí)_第2頁(yè)
DB2數(shù)據(jù)庫(kù)對(duì)象基礎(chǔ)知識(shí)_第3頁(yè)
DB2數(shù)據(jù)庫(kù)對(duì)象基礎(chǔ)知識(shí)_第4頁(yè)
DB2數(shù)據(jù)庫(kù)對(duì)象基礎(chǔ)知識(shí)_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、DB2數(shù)據(jù)庫(kù)對(duì)象基本數(shù)據(jù)庫(kù)對(duì)象 數(shù)據(jù)庫(kù)對(duì)象是一個(gè)數(shù)據(jù)據(jù)庫(kù)的構(gòu)造塊(building block)。DB2 提供了不同類型型的數(shù)據(jù)庫(kù)對(duì)象來(lái)來(lái)存儲(chǔ)和表示不同同信息。通過(guò)使用用數(shù)據(jù)定義語(yǔ)言(DDL),可可以創(chuàng)建、修改和和刪除數(shù)據(jù)庫(kù)對(duì)象象。要操縱數(shù)據(jù)庫(kù)庫(kù)對(duì)象,可以使用用數(shù)據(jù)操縱語(yǔ)言(DML),例例如 SELECT、UPDATE、INSERT 和 SELECT 語(yǔ)句。常用的數(shù)數(shù)據(jù)庫(kù)對(duì)象有:x。表 用戶定義數(shù)據(jù)類型 約束 視圖 索引 除了 Family Fundamentals 教程里介紹的一一些數(shù)據(jù)庫(kù)對(duì)象外外,還有一些其他他的對(duì)象,很多開(kāi)開(kāi)發(fā)人員在開(kāi)發(fā) DB2 應(yīng)用程程序時(shí)會(huì)發(fā)現(xiàn)這些些對(duì)象比較有用。本本

2、節(jié)我們將介紹這這些對(duì)象。v。在繼續(xù)之前,有一點(diǎn)要要注意:在下面看看到的一些例子中中,對(duì)象名稱是以以小寫形式指定的的。無(wú)論 DB2 在哪個(gè)平臺(tái)上運(yùn)運(yùn)行,它總是以大大寫形式存儲(chǔ)名稱稱,除非標(biāo)識(shí)符的的名稱以雙引號(hào)()括起來(lái)了。R。例如,下面的語(yǔ)句創(chuàng)建建一個(gè)名為 employee(小小寫)的表,該表表的列定義與表 EMPLOYEE(大大寫)是一樣的。8。CREATE TABLE employee LIKE employeez。別名 別名(alias) 是指一個(gè)已有的的表、視圖的另一一個(gè)名稱,也叫昵昵稱(nickname)。別別名也可以作為另另一個(gè)別名的昵稱稱。與這些對(duì)象一一樣,別名也可以以被創(chuàng)建或刪除

3、,可可以有與之相關(guān)的的注釋。下面是 CREATE ALIAS 語(yǔ)語(yǔ)句的一些例子:d。CREATE ALIAS aliastab1 FOR tab1;s。CREATE ALIAS bob.aliastab1 FOR tom.tab1;S。CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;c??梢钥吹剑珻REATE ALIAS 語(yǔ)語(yǔ)句比較簡(jiǎn)單??煽梢栽谠磳?duì)象所在在的同一模式中創(chuàng)創(chuàng)建別名(如第 1 行),或者者也可以全限定別別名(如第 2 行)。為了與 DB2 for zSeries 兼容,使用關(guān)鍵鍵字 SYNONYM 代替 ALIAS 也是合法的(如如第

4、 3 行)。A。使用別名時(shí)無(wú)需專門的的授權(quán)或權(quán)限。不不過(guò),需要獲得與與別名所引用的底底層對(duì)象相關(guān)的授授權(quán)。關(guān)于數(shù)據(jù)庫(kù)庫(kù)對(duì)象權(quán)限的完整整清單,請(qǐng)參考 DB2 DBA 認(rèn)證教程 Server management(請(qǐng)請(qǐng)參閱 參考資料料)。e。前面已提到,我們也可可以為 昵稱 創(chuàng)創(chuàng)建別名。昵稱是是引用位于聯(lián)邦系系統(tǒng)上的數(shù)據(jù)表或或視圖的數(shù)據(jù)庫(kù)對(duì)對(duì)象。聯(lián)邦數(shù)據(jù)庫(kù)庫(kù)支持超出了本教教程的范圍。在本本教程系列的第 2 部分,Data manipulation ,我們將學(xué)習(xí)更更多有關(guān)聯(lián)邦系統(tǒng)統(tǒng)的知識(shí)。M。要為別名添加注釋,可可以發(fā)出以下語(yǔ)句句:COMMENT ON aliastab1 IS My first a

5、lias on tab1r。要?jiǎng)h除一個(gè)別名,使用用 DROP 語(yǔ)語(yǔ)句,這與所有其其他數(shù)據(jù)庫(kù)對(duì)象是是一樣的:v。DROP ALIAS aliastab1序列對(duì)象 序列(sequence)是是一種數(shù)據(jù)庫(kù)對(duì)象象,這種對(duì)象允許許自動(dòng)生成值。序序列對(duì)象與標(biāo)識(shí)列列(identity column)不不同,標(biāo)識(shí)列是要要與一個(gè)特定的表表綁在一起的,而而序列是一種全局局的、獨(dú)立的對(duì)象象,同一個(gè)數(shù)據(jù)庫(kù)庫(kù)中的任何表都可可以使用它。X。標(biāo)識(shí)列是序列對(duì)象的一一種特例。因此,標(biāo)標(biāo)識(shí)列的特征也適適用于序列對(duì)象。下下面就例釋了一條條 CREATE SEQUENCE 語(yǔ)句:n。CREATE SEQUENCE myseq AS

6、INTEGERA。 START WITH 360 INCREMENT BY 10 NO MAXVALUE CYCLE CACHE 20 任何包括 0 在內(nèi)的的數(shù)字?jǐn)?shù)據(jù)類型都都可用于序列值。這這些類型包括 SMALLINT、INTEGER、BIGINT 或 DECIMAL?;谶@些數(shù)據(jù)類型型的任何用戶定義義獨(dú)特類型(distinct type)也都都可以用于序列值值。這進(jìn)一步擴(kuò)展展了用戶定義獨(dú)特特類型在應(yīng)用程序序中的使用。 q。如上面的例子所示,您您可以為序列對(duì)象象指定起始值,從從而自定義序列對(duì)對(duì)象。在這個(gè)例子子中,序列的第一一個(gè)值是 360。后后續(xù)值的生成是由由 INCREMENT BY 子

7、句控制制的。這里還支持持正、負(fù)常量,以以產(chǎn)生升序和降序序值。 3。缺省情況下,一個(gè)序列列所生成的最小值值和最大值是由該該序列數(shù)據(jù)類型的的取值范圍來(lái)界定定的。例如,INTEGER 類型的序列值必必須處在 -2,147,483,647 到 2,147,483,647 之間的范圍內(nèi)。在在 DB2 SQL Reference Guide 中中可以找到所有數(shù)數(shù)字?jǐn)?shù)據(jù)類型的取取值范圍。為了改改變這種缺省行為為,可以使用 MINVALUE 和 MAXVALUE 選項(xiàng)來(lái)為生成的的值設(shè)置一個(gè)邊界界。如果達(dá)到了最最小值或最大值,那那么可以使用另一一個(gè)選項(xiàng),即 CYCLE 或 NO CYCLE 來(lái)規(guī)定序列值是是否應(yīng)

8、該循環(huán)。注注意,如果 CYCLE 生效,則序列就就可以生成重復(fù)的的值。j。CACHE 選項(xiàng)允許許 DB2 將一一些預(yù)先分配好空空間的值保留在內(nèi)內(nèi)存中,以提高性性能。CACHE 20 是缺省的的行為。關(guān)于這個(gè)個(gè)選項(xiàng)有一點(diǎn)要謹(jǐn)謹(jǐn)記:如果在所有有緩存的值被使用用之前關(guān)閉 DB2,那那么任何緩存的值值和未使用的值都都將被丟棄。當(dāng) DB2 重新啟啟動(dòng)時(shí),又會(huì)生成成和緩存下一塊的的值,從而造成值值之間的不連續(xù),即即值之間存在間隔隔。如果應(yīng)用程序序不允許值之間有有間隔,可以考慮慮使用 NOCACHE 選項(xiàng)。o。如果沒(méi)有使用緩存,則則性能就會(huì)下降,因因?yàn)橐l繁地生成成序列數(shù)字。每當(dāng)當(dāng)生成一個(gè)新值的的時(shí)候,都會(huì)

9、寫下下一條日志記錄。因因此,更高效的做做法是根據(jù)請(qǐng)求來(lái)來(lái)獲取值,并將這這些值緩存在內(nèi)存存中。J。通過(guò) ALTER SEQUENCE 語(yǔ)句,可以更改改序列對(duì)象的特征征。除了序列值的的數(shù)據(jù)類型以外,上上面所討論的所有有的設(shè)置都可以修修改。要獲得完整整的語(yǔ)法,請(qǐng)參考考 DB2 SQL Reference Guide (請(qǐng)請(qǐng)參閱 參考資料料)。W。刪除一個(gè)序列對(duì)象與刪刪除任何其他的數(shù)數(shù)據(jù)庫(kù)對(duì)象是一樣樣的,不同之處是是這里還要使用到到一個(gè) RESTRICT 關(guān)鍵字。這樣可可以防止在有依賴賴的情況下刪除序序列。9。DROP SEQUENCE myseq RESTRICT生成和獲取序列值 序列是一種數(shù)據(jù)庫(kù)對(duì)

10、象象,因此對(duì)序列的的訪問(wèn)也是由權(quán)限限來(lái)控制的。缺省省情況下,只有序序列的創(chuàng)建者,即即 SYSADM 和 DBADM 擁有該對(duì)象的 USAGE 權(quán)權(quán)限。如果希望其其他用戶也能夠使使用序列,則需要要使用下面的語(yǔ)句句:W。GRANT USAGE ON SEQUENCE seq_object_name TO PUBLICU。有兩種表達(dá)式可用于生生成和獲取序列值值。NEXTVAL FOR seq-name 用于于獲取下一個(gè)序列列值,而 PREVVAL FOR seq-name 則用用于獲取上一個(gè)生生成的序列值。下下面的例子例釋了了這些表達(dá)式的使使用。4。INSERT INTO t1 VALUES (NE

11、XTVAL FOR myseq, BOB);R。INSERT INTO t1 VALUES (NEXTVAL FOR myseq, PAT);g。COMMIT;INSERT INTO t1 VALUES (NEXTVAL FOR myseq, GENE);F。ROLLBACK;INSERT INTO t1 VALUES (NEXTVAL FOR myseq, PAUL);V。VALUES PREVVAL FOR myseq INTO :hostvarN。假設(shè)我們以一個(gè)空表 t1 開(kāi)始,myseq 的下一個(gè)序列值值是 1。如果禁禁用了 autocommit,則則在執(zhí)行上述語(yǔ)句句之后,t1 將將包

12、含下面幾行:G。1NAME-1BOB2PAT4PAUL 3 record(s) selected.雖然為 GENE 生生成的值被回滾了了,但是 DB2 并沒(méi)有再次使用用它。因而,下一一個(gè)為 PAUL 生成的序列值就就是 4,而不是是 3。 e。這個(gè)例子中的最后一條條語(yǔ)句展示了如何何使用 PREVVAL 表達(dá)式。宿主變變量 :hostvar 存儲(chǔ)當(dāng)前會(huì)話中中生成的最后一個(gè)個(gè)值。如果想保存存前面生成的值,那那么應(yīng)該在生成下下一個(gè)值之前保存存 PREVVAL 值。j。臨時(shí)表 顧名思義,臨時(shí)表(temporary table)不不是永久性的數(shù)據(jù)據(jù)庫(kù)對(duì)象。臨時(shí)表表與普通的表在行行為上是一樣的,不不同之處

13、是,并非非所有的功能和選選項(xiàng)都是受支持的的和/或是必需的的。臨時(shí)表只能維維持在一次連接期期間。當(dāng)連接關(guān)閉閉時(shí),在此連接內(nèi)內(nèi)聲明的所有臨時(shí)時(shí)表都將自動(dòng)刪除除掉。 V。只有聲明臨時(shí)表的會(huì)話話或應(yīng)用程序才能能訪問(wèn)臨時(shí)表。如如果兩個(gè)應(yīng)用程序序用相同的名字創(chuàng)創(chuàng)建了一個(gè)臨時(shí)表表,該臨時(shí)表的每每個(gè)實(shí)例仍然是惟惟一的。因而,完完全不必?fù)?dān)心出現(xiàn)現(xiàn)臨時(shí)數(shù)據(jù)沖突的的情況。由于臨時(shí)時(shí)表只允許單連接接(single-connection)訪訪問(wèn),因此這里無(wú)無(wú)需使用鎖。這正正是臨時(shí)表的一個(gè)個(gè)主要的性能優(yōu)勢(shì)勢(shì)。U。聲明臨時(shí)表 要聲明一個(gè)臨時(shí)表,必必須存在一個(gè) USER 臨時(shí)表空間(不不同于 SYSTEM 臨時(shí)表空間),用用

14、以存儲(chǔ)臨時(shí)表的的定義和內(nèi)容。SYSTEM 臨時(shí)表空間只是是 DB2 在內(nèi)內(nèi)部用來(lái)執(zhí)行諸如如排序之類操作的的。下面這條簡(jiǎn)單單的語(yǔ)句將創(chuàng)建一一個(gè)用戶臨時(shí)表空空間。o。CREATE USER TEMPORARY TABLESPACE usertempspaceB。 MANAGED BY SYSTEM USING (usertempspace)1。聲明全局臨時(shí)表時(shí),可可以使用很多可選選子句。下面的例例子對(duì)這些子句的的特性作了說(shuō)明。Z。DECLARE GLOBAL TEMPORARY TABLE t_dept L。( deptid CHAR(6), deptname CHAR(20) )z。ON COM

15、MIT DELETE ROWS NOT LOGGEDIN usertempspace在這個(gè)例子中,聲明了了臨時(shí)表 t_dept,這這個(gè)表有兩列。ON COMMIT DELETE ROWS 子句句規(guī)定在每次執(zhí)行行 COMMIT 操作時(shí)刪除臨時(shí)時(shí)表的內(nèi)容。在 DB2 V8 中,可以選擇記記錄對(duì)臨時(shí)表的更更改,以便回滾。這這個(gè)例子規(guī)定對(duì)該該表的更改是 NOT LOGGED。這這意味著對(duì)該表的的任何操作,包括括創(chuàng)建以及更改,都都不做日志記錄。如如果在一個(gè)工作單單位內(nèi)創(chuàng)建表,然然后回滾,則臨時(shí)時(shí)表將被刪除。另另一方面,如果在在此工作單位內(nèi)刪刪除該表,則該表表在恢復(fù)時(shí)將沒(méi)有有任何行。U。無(wú)需使用 IN 子

16、句句來(lái)指定該臨時(shí)表表將要使用的用戶戶臨時(shí)表空間。如如果沒(méi)有指定該信信息,DB2 就就會(huì)搜索最適用的的表空間。如果找找不到用戶臨時(shí)表表空間,DB2 將產(chǎn)生一個(gè)錯(cuò)誤誤。1。讓我們看看另一個(gè)例子子:DECLARE GLOBAL TEMPORARY TABLE t_proj a。 LIKE project ON COMMIT PRESERVE ROWS WITH REPLACE IN usertempspace臨時(shí)表 t_proj 是用 LIKE 關(guān)鍵字聲明的,因因此它擁有與名為為 project 的持久表或視圖圖相同的列定義。ON COMMIT PRESERVE ROWS 子句句表明,在執(zhí)行 COM

17、MIT 語(yǔ)句時(shí),該臨時(shí)時(shí)表中的所有行都都將被保留。因此此,這些行就可以以在下一次事務(wù)中中用于進(jìn)一步的處處理。A。在同一次會(huì)話中使用相相同的名稱聲明另另一個(gè)臨時(shí)表之前前,首先必須刪除除該臨時(shí)表??梢砸燥@式地刪除該表表,也可以像這里里一樣使用 WITH REPLACE 選項(xiàng)。如果使用用了 WITH REPLACE 選項(xiàng),DB2 將隱式地刪除所所有數(shù)據(jù),刪除該該臨時(shí)表,并用新新的定義重新創(chuàng)建建該臨時(shí)表。U。如果使用了 連接池(connection pooling),WITH REPLACE 選項(xiàng)用起來(lái)就十十分方便了。連接接池是用于重用數(shù)數(shù)據(jù)庫(kù)連接的一種種機(jī)制,這樣就不不必完全按照要求求分配和回收資源

18、源。這些操作的開(kāi)開(kāi)銷都是相當(dāng)大的的,尤其是在有大大量執(zhí)行很短事務(wù)務(wù)的連接時(shí),更是是如此。由于沒(méi)有有釋放連接,先前前使用的臨時(shí)表就就可能得不到清除除。下一個(gè)使用該該連接的應(yīng)用程序序就可能使用上一一次執(zhí)行時(shí)遺留下下來(lái)的數(shù)據(jù)。因此此,使用 WITH REPLACE 選項(xiàng)可以保證用用新的定義刷新所所聲明的臨時(shí)表。S。模式與數(shù)據(jù)庫(kù)對(duì)象 大多數(shù)數(shù)據(jù)庫(kù)對(duì)象都是是用一個(gè) 模式(schema) 和一個(gè) 對(duì)象名名(object name)標(biāo)識(shí)識(shí)的。數(shù)據(jù)庫(kù)模式式為數(shù)據(jù)庫(kù)對(duì)象提提供邏輯上的分類類。下面例釋了這這種分為兩部分的的對(duì)象名:F。DB2ADMIN.EMPLOYEEHRPROD.AUDIT_VIEWHRPROD

19、.AUDIT_TRIG如果在訪問(wèn)數(shù)據(jù)庫(kù)對(duì)象象時(shí)沒(méi)有指定模式式,則用于建立數(shù)數(shù)據(jù)庫(kù)連接的用戶戶 ID 將被設(shè)設(shè)為缺省的模式。例例如,如果用戶 db2admin 連接到一個(gè)數(shù)據(jù)據(jù)庫(kù),并創(chuàng)建表 T1,則 DB2 將創(chuàng)建一個(gè)名為為 db2admin.T1 的表。此后所有有引用非全限定(unqualified)表表名 T1 的 SQL 語(yǔ)句都都解析為 db2admin.T1。q。DB2 專用寄存器:CURRENT SCHEMA 您在進(jìn)行自己的數(shù)據(jù)庫(kù)庫(kù)工作時(shí)可能已經(jīng)經(jīng)發(fā)現(xiàn),用同為對(duì)對(duì)象的模式的用戶戶 ID 連接到到一個(gè)數(shù)據(jù)庫(kù)并非非總是可行的。而而硬編碼(hard-coding)應(yīng)應(yīng)用程序以完全限限定對(duì)象也

20、不是最最好的解決辦法。幸幸運(yùn)的是,DB2 允許使用 SET CURRENT SCHEMA 命令更改當(dāng)前模模式。缺省情況下下,CURRENT SCHEMA DB2 專用寄寄存器被設(shè)置為連連接到數(shù)據(jù)庫(kù)的 USER。如果果更改 CURRENT SCHEMA,那那么任何非全限定定的數(shù)據(jù)庫(kù)對(duì)象都都會(huì)在前面加上新新的值。I。當(dāng)前模式可以通過(guò)下面面這個(gè)命令獲得:VALUES CURRENT SCHEMA要對(duì)它進(jìn)行更改,只需需使用下面的命令令:SET SCHEMA=db2adminDB2應(yīng)用程序開(kāi)發(fā)數(shù)數(shù)據(jù)庫(kù)對(duì)象例程 在本節(jié)中,我們將介紹紹更多類型的數(shù)據(jù)據(jù)庫(kù)對(duì)象。這些對(duì)對(duì)象統(tǒng)統(tǒng)都叫做 例程(routine)。從

21、從功能上分,主要要有三種例程:存存儲(chǔ)過(guò)程(stored procedure)、函數(shù)(function)和和方法(method)。(要要了解這些類型之之間的更多不同之之處,請(qǐng)參閱 存存儲(chǔ)過(guò)程、函數(shù)和和方法。)9。例程是封裝了與某一特特定任務(wù)相關(guān)的編編程和數(shù)據(jù)庫(kù)邏輯輯的數(shù)據(jù)庫(kù)對(duì)象。有有效地使用例程可可以簡(jiǎn)化應(yīng)用程序序的代碼,并增加加代碼的可重用性性。例如,如果將將某種業(yè)務(wù)邏輯封封裝在一個(gè)例程中中,那么對(duì)此業(yè)務(wù)務(wù)規(guī)則的更改只會(huì)會(huì)影響那個(gè)特定的的例程。從而可最最小化對(duì)應(yīng)用程序序的更改。6。例程是在數(shù)據(jù)庫(kù)服務(wù)器器上定義和處理的的。這樣就允許應(yīng)應(yīng)用程序利用數(shù)據(jù)據(jù)庫(kù)服務(wù)器的能力力,從而減少客戶戶機(jī)上的處理負(fù)

22、載載。2。通常,復(fù)雜的業(yè)務(wù)邏輯輯需要多條 SQL 語(yǔ)句。這些語(yǔ)句句要分別地從客戶戶機(jī)發(fā)送到服務(wù)器器,如果數(shù)據(jù)庫(kù)活活動(dòng)很多,就會(huì)產(chǎn)產(chǎn)生大量的網(wǎng)絡(luò)傳傳輸。如果將這些些操作放在一個(gè)例例程中,那么客戶戶機(jī)和服務(wù)器之間間的網(wǎng)絡(luò)傳輸就會(huì)會(huì)大大減少,從而而可以提高應(yīng)用程程序的總體性能。X。加強(qiáng)安全的能力是使用用例程的另一個(gè)關(guān)關(guān)鍵優(yōu)勢(shì)。例程可可用于屏蔽對(duì)底層層數(shù)據(jù)庫(kù)對(duì)象的直直接訪問(wèn)。用 EXECUTE 權(quán)限調(diào)用一個(gè)例例程就足夠了,無(wú)無(wú)需擁有訪問(wèn)底層層數(shù)據(jù)庫(kù)對(duì)象的顯顯式的權(quán)限。0。例程的不同實(shí)現(xiàn) 例程有幾種可能的實(shí)現(xiàn)現(xiàn):內(nèi)置(built-in)例例程是 DB2 系統(tǒng)附帶的。這這些例程定義在一一個(gè)系統(tǒng)模式中,例例

23、如 SYSIBM、SYSPROC、SYSFUN 和 SYSTOOLS。 9。Sourced 例程程只適用于函數(shù)。sourced 例程復(fù)制另一個(gè)個(gè)函數(shù)的語(yǔ)義。 w。外部(external)例例程是用一種外部部的編程語(yǔ)言實(shí)現(xiàn)現(xiàn)的。對(duì)于 DB2 V8.1,可以以用下列受支持的的語(yǔ)言開(kāi)發(fā)例程: o。Java 語(yǔ)言 C/C+ OLE(僅用于存儲(chǔ)過(guò)過(guò)程) OLE DB(僅用于于表函數(shù)) SQL 例程是用 SQL Procedural Language (SQL PL)實(shí)實(shí)現(xiàn)的。DB2 SQL PL 是 SQL Persistent Stored Modules (SQL/PSM) 語(yǔ)言標(biāo)準(zhǔn)的一一個(gè)子集。該

24、標(biāo)準(zhǔn)準(zhǔn)是與 SQL 一起用來(lái)編寫存存儲(chǔ)過(guò)程、函數(shù)和和方法的結(jié)構(gòu)化編編程語(yǔ)言的基礎(chǔ)。它它將 SQL 數(shù)數(shù)據(jù)訪問(wèn)的容易性性與簡(jiǎn)單編程語(yǔ)言言的流控制結(jié)構(gòu)相相結(jié)合。這就是 SQL PL 如此流行的一個(gè)個(gè)主要原因。M。存儲(chǔ)過(guò)程、函數(shù)和方法法 存儲(chǔ)過(guò)程 是一種數(shù)據(jù)據(jù)庫(kù)對(duì)象,它包含含用于訪問(wèn)和修改改一個(gè)或多個(gè)表中中數(shù)據(jù)的專門程序序。在一個(gè)存儲(chǔ)過(guò)過(guò)程內(nèi),可以以一一定的流邏輯包裝裝多條 SQL 語(yǔ)句。存儲(chǔ)過(guò)程程可以作為對(duì)客戶戶機(jī)應(yīng)用程序或其其他例程的子例程程擴(kuò)展。存儲(chǔ)過(guò)程程的執(zhí)行和管理是是由一個(gè)關(guān)系數(shù)據(jù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)控控制的。K。函數(shù) 是可以自定義的的 SQL 擴(kuò)展展??梢栽?SQL 語(yǔ)句(例如一個(gè)

25、個(gè) select-list 或 FROM 子句句)中調(diào)用函數(shù)。有有四種類型的函數(shù)數(shù):聚合(aggregate)函函數(shù)、標(biāo)量(scalar)函函數(shù)、行(row)函函數(shù)以及 表(table)函函數(shù)。 n。存儲(chǔ)過(guò)程通常用于封裝裝復(fù)雜的應(yīng)用程序序邏輯,以及執(zhí)行行開(kāi)銷較大的數(shù)據(jù)據(jù)庫(kù)操作,例如多多表聯(lián)結(jié)和游標(biāo)操操作。而函數(shù) 尤其是 SQL 函數(shù) 通常包含更更簡(jiǎn)單的操作。編編寫在 SQL 函數(shù)中的語(yǔ)句將將展開(kāi)到引用它們們的 SQL 語(yǔ)語(yǔ)句中,與這些 SQL 語(yǔ)句一一起執(zhí)行。這導(dǎo)致致這些語(yǔ)句在執(zhí)行行時(shí)動(dòng)態(tài)編譯。如如果一條 SQL 語(yǔ)句中使用了一一個(gè)復(fù)雜的 SQL 函數(shù),則 DB2 要求使用附加的的資源來(lái)編譯它

26、,并并生成一個(gè)數(shù)據(jù)訪訪問(wèn)計(jì)劃。這樣將將影響整個(gè)運(yùn)行時(shí)時(shí)性能。 a。方法 用于封裝為結(jié)構(gòu)構(gòu)類型提供行為的的邏輯,結(jié)構(gòu)類型型包含一個(gè)或多個(gè)個(gè)指定的屬性,各各屬性有其自己的的數(shù)據(jù)類型。p。DB2 專用寄存器:CURRENT PATH 與大多數(shù) DB2 數(shù)數(shù)據(jù)庫(kù)對(duì)象一樣,一一個(gè)完整的例程名名由一個(gè)模式和一一個(gè)例程名組成。 DB2 專用寄寄存器 CURRENT SCHEMA可可以為大多數(shù)數(shù)據(jù)據(jù)庫(kù)對(duì)象解析模式式,但不能為例程程解析模式。相反反,DB2 是使使用 CURRENT PATH 專用用寄存器來(lái)定位例例程的。n。通過(guò)下面的命令可以獲獲得 CURRENT PATH 設(shè)置置:VALUES CURRENT

27、 PATH缺省路徑包含三個(gè)系統(tǒng)統(tǒng)模式,后面跟有有連接到數(shù)據(jù)庫(kù)的的當(dāng)前用戶。例如如:6。SYSIBM,SYSFUN,SYSPROC,DB2ADMINT。下面是一些例子和技巧巧,您可以用它們們來(lái)更新 PATH:SET PATH=CURRENT PATH,USER2VALUES CURRENT PATH-SYSIBM,SYSFUN,SYSPROC,DB2ADMIN,USER2e。1 record(s) selected.嵌入式 SQL 程序序嵌入式 SQL 簡(jiǎn)介介 DB2 為開(kāi)發(fā)人員提提供了不同的編程程方法來(lái)編寫應(yīng)用用程序。最直接的的一種方法是嵌入入式 SQL 編編程。這種編程方方法是 直接的,因因

28、為程序嵌入了直直接與 DB2 交互的 SQL 語(yǔ)句。程序可以以用下列受支持的的編程語(yǔ)言中的任任何一種來(lái)編寫:6。C/C+ FORTRAN COBOL Java 語(yǔ)言 (SQLJ) 如何構(gòu)造嵌入式 SQL 語(yǔ)句取決于所選選擇的編程語(yǔ)言。C/C+ 和 FORTRAN 中的嵌入式 SQL 語(yǔ)句前面要加上上 EXEC SQL 關(guān)鍵字:T。EXEC SQL SELECT lastname,empid INTO :hostvar1, :hostvar2 i。FROM employee WHERE deptno=OPERATIONS;t。COBOL 中的嵌入入式 SQL 語(yǔ)語(yǔ)句非常類似于 C/C+ 中中的那

29、些嵌入式 SQL 語(yǔ)句,不不同的是在語(yǔ)句的的后面要使用 END-EXEC 關(guān)鍵鍵字:4。EXEC SQL SELECT lastname,empid INTO :hostvar1, :hostvar2 m。 FROM employee WHERE deptno=OPERATIONS END-EXEC;p。Java 語(yǔ)言中的嵌嵌入式 SQL 語(yǔ)句與前面兩個(gè)個(gè)例子中展示的那那些嵌入式 SQL 語(yǔ)句稍微有些不不同,這里必須指指定語(yǔ)句將來(lái)執(zhí)行行時(shí)所在的連接上上下文。下面是一一個(gè)例子:8。#sql myConnCtx SELECT lastname, empid INTO :hostvar1, :hos

30、tvar2 P。 FROM employee WHERE deptno=OPERATIONS;9。為了讓您更好地了解嵌嵌入式 SQL 語(yǔ)句是什么樣子子的,下面給出了了用 C 編寫的的一個(gè)程序的代碼碼片斷。在本系列列(請(qǐng)參閱 參考考資料)的第 3 篇教程中,您將將了解到更多關(guān)于于程序預(yù)編譯和實(shí)實(shí)際代碼開(kāi)發(fā)的知知識(shí)。 TbBasic(void) int rc = 0; struct sqlca sqlca; EXEC SQL BEGIN DECLARE SECTION;3。 char hostVarStmt50; EXEC SQL END DECLARE SECTION; /* delc

31、are cursor */ EXEC SQL DECLARE c1 CURSOR FOR SELECT deptnumb, deptname FROM org WHERE deptnumb = 40;h。 /* open cursor */ EXEC SQL OPEN c1; /* fetch cursor */ EXEC SQL FETCH c1 INTO :deptnumb, :deptname;w。 while (sqlca.sqlcode != 100) printf( %8d %-14sn, deptnumb, deptname);6。 EXEC SQL FETCH c1 INTO

32、:deptnumb, :deptname;j。 /* close cursor */ EXEC SQL CLOSE c1; /* prepare the statement */ strcpy(hostVarStmt, DELETE FROM org WHERE deptnumb = 15);j。 EXEC SQL PREPARE Stmt FROM :hostVarStmt;9。 /* execute the statement */ EXEC SQL EXECUTE Stmt; /* ROLLBACK the transaction */ EXEC SQL ROLLBACK; return

33、 0;靜態(tài) SQL 在前一小節(jié)中,我們演演示了兩種不同類類型的嵌入式 SQL 語(yǔ)句:靜態(tài)嵌入入式 SQL 和和動(dòng)態(tài)嵌入式 SQL。u。這個(gè)例子中的 SELECT 語(yǔ)句說(shuō)明了靜態(tài)態(tài) SQL 的使使用。編寫靜態(tài) SQL 時(shí),必必須指定完整的語(yǔ)語(yǔ)句。表名、列名名以及所引用的數(shù)數(shù)據(jù)類型都是已知知的。惟一可以在在運(yùn)行時(shí)指定的信信息是使用宿主變變量的 SQL 語(yǔ)句的 WHERE 子句中的值。2。編譯靜態(tài) SQL 語(yǔ)語(yǔ)句(或者,用 DB2 術(shù)語(yǔ)更更確切地說(shuō),準(zhǔn)備備好的(prepared)SQL 語(yǔ)句)時(shí),將為為其生成數(shù)據(jù)訪問(wèn)問(wèn)計(jì)劃,并存儲(chǔ)在在數(shù)據(jù)庫(kù)中的一個(gè)個(gè)包里面。當(dāng)調(diào)用用包含該語(yǔ)句的應(yīng)應(yīng)用程序時(shí),這個(gè)個(gè)包

34、將被執(zhí)行。由由于在運(yùn)行時(shí)不需需要編譯語(yǔ)句,因因此執(zhí)行靜態(tài) SQL 時(shí)沒(méi)用編譯開(kāi)銷銷。b。在準(zhǔn)備語(yǔ)句時(shí),DB2 使用數(shù)據(jù)庫(kù)統(tǒng)計(jì)計(jì)信息和配置參數(shù)數(shù)來(lái)估計(jì)和獲得訪訪問(wèn)計(jì)劃。如果數(shù)數(shù)據(jù)庫(kù)統(tǒng)計(jì)信息有有變化,則預(yù)先生生成的訪問(wèn)計(jì)劃可可能不如一開(kāi)始生生成時(shí)那樣是最佳佳的。k。創(chuàng)建包和將包與數(shù)據(jù)庫(kù)庫(kù)綁定時(shí),要對(duì)準(zhǔn)準(zhǔn)備靜態(tài) SQL 語(yǔ)句的人進(jìn)行授授權(quán)。只要執(zhí)行包包的人擁有包的 EXECUTE 權(quán)限,他就不需需要具備該包中所所引用的數(shù)據(jù)庫(kù)對(duì)對(duì)象上的顯式的權(quán)權(quán)限。m。動(dòng)態(tài) SQL 動(dòng)態(tài)(Dynamic SQL) 語(yǔ)句句是在運(yùn)行時(shí)動(dòng)態(tài)態(tài)處理的。語(yǔ)句的的結(jié)構(gòu)直到執(zhí)行應(yīng)應(yīng)用程序時(shí)才需要要。D。注意,嵌入式 SQL 簡(jiǎn)介

35、中展示的的例子 SQL 語(yǔ)句使用動(dòng)態(tài) SQL 來(lái) PREPARE 和 EXECUTE 一條 DELETE 語(yǔ)句。DELETE 語(yǔ)句的文本存儲(chǔ)儲(chǔ)在一個(gè)宿主變量量 hostVarStmt 中。當(dāng)該語(yǔ)句 PREPARE 好后,系統(tǒng)將生生成該語(yǔ)句的一個(gè)個(gè)可執(zhí)行格式,并并將其存儲(chǔ)在數(shù)據(jù)據(jù)庫(kù)中的一個(gè)包里里面。一旦生成了了數(shù)據(jù)訪問(wèn)計(jì)劃,準(zhǔn)準(zhǔn)備好的語(yǔ)句就可可以 EXECUTE 了。聽(tīng)起來(lái)好像像有點(diǎn)熟悉,不是是嗎?是的:這兩兩個(gè)處理階段與靜靜態(tài) SQL 語(yǔ)語(yǔ)句正好是一樣的的。惟一的不同點(diǎn)點(diǎn)是,動(dòng)態(tài) SQL 的 PREPARE 和 EXECUTE 都是在運(yùn)行時(shí)進(jìn)進(jìn)行,而靜態(tài) SQL 在預(yù)編譯時(shí)準(zhǔn)備備訪問(wèn)計(jì)劃,并將

36、將其保存在數(shù)據(jù)庫(kù)庫(kù)中。i。動(dòng)態(tài) SQL 語(yǔ)句必必須總是在執(zhí)行之之前準(zhǔn)備好,不管管是否有相同的語(yǔ)語(yǔ)句(相同的訪問(wèn)問(wèn)計(jì)劃)一次又一一次地重復(fù)使用。為為了最小化這些準(zhǔn)準(zhǔn)備工作的開(kāi)銷,DB2 提供了 包緩存存(也叫 動(dòng)態(tài)查查詢緩存),用以以將經(jīng)常使用的訪訪問(wèn)計(jì)劃保存在內(nèi)內(nèi)存中。包緩存(package cache)明明顯地減少了重復(fù)復(fù)的 SQL 準(zhǔn)準(zhǔn)備請(qǐng)求的代價(jià),然然而發(fā)起和響應(yīng)準(zhǔn)準(zhǔn)備請(qǐng)求的開(kāi)銷仍仍然存在。E。在準(zhǔn)備語(yǔ)句時(shí),總是使使用當(dāng)前數(shù)據(jù)庫(kù)統(tǒng)統(tǒng)計(jì)信息。因此,就就可以生成最佳的的數(shù)據(jù)訪問(wèn)路徑。2。SQL 語(yǔ)句的授權(quán)是是在運(yùn)行時(shí)決定的的。執(zhí)行應(yīng)用程序序的人必須有適當(dāng)當(dāng)?shù)臋?quán)限來(lái)訪問(wèn)語(yǔ)語(yǔ)句中所引用的數(shù)數(shù)據(jù)庫(kù)

37、對(duì)象。下一一小節(jié)將更詳細(xì)地地討論 DB2 權(quán)限。W。安全考慮 要預(yù)編譯嵌入式靜態(tài) SQL 程序,用用戶需要程序中所所引用數(shù)據(jù)庫(kù)對(duì)象象的顯式的權(quán)限。由由于預(yù)編譯或 PREPARE 階段會(huì)生成一個(gè)個(gè)包,并將其存儲(chǔ)儲(chǔ)在數(shù)據(jù)庫(kù)中,因因此該用戶還必須須擁有 BINDADD 權(quán)限,以便添加加新的包到數(shù)據(jù)庫(kù)庫(kù)中。為了執(zhí)行帶帶有靜態(tài) SQL 的程序,用戶只只需具有相關(guān)包上上的 EXECUTE 權(quán)限。i。編譯嵌入式動(dòng)態(tài) SQL 程序的用戶也需需要 BINDADD 權(quán)限。這里不再再需求其他的權(quán)限限,因?yàn)閯?dòng)態(tài) SQL 不是在編譯時(shí)準(zhǔn)準(zhǔn)備的。在程序執(zhí)執(zhí)行時(shí),用戶需要要所有必需的權(quán)限限來(lái)發(fā)出每條 SQL 語(yǔ)句,同時(shí)還需

38、需要為嵌入式 SQL 程序創(chuàng)建的包上上的 EXECUTE 權(quán)限。x。下面的表總結(jié)了預(yù)編譯譯和執(zhí)行一個(gè)只有有靜態(tài) SQL 或只有動(dòng)態(tài) SQL 的程序所需的權(quán)權(quán)限。 p。靜態(tài) SQL 與動(dòng)態(tài)態(tài) SQL在下面的表中,讓我們們總結(jié)并詳細(xì)闡述述我們所學(xué)到的關(guān)關(guān)于靜態(tài) SQL 和動(dòng)態(tài) SQL 的知識(shí):L?;隍?qū)動(dòng)程序的 API基于驅(qū)動(dòng)程序的 API雖然大多數(shù)供應(yīng)商都支支持嵌入式 SQL 數(shù)據(jù)庫(kù)訪問(wèn),但但如果您想要使用用同樣的源代碼,并并將嵌入式 SQL 應(yīng)用程序部署到到多個(gè)數(shù)據(jù)庫(kù)系統(tǒng)統(tǒng)上,那么還需要要一個(gè)額外的工作作。必須用不同供供應(yīng)商的特定的預(yù)預(yù)編譯器預(yù)編譯程程序。還必須生成成數(shù)據(jù)訪問(wèn)計(jì)劃,并并綁定到目

39、標(biāo)數(shù)據(jù)據(jù)庫(kù)。為了增加應(yīng)應(yīng)用程序的可移植植性,還應(yīng)考慮使使用本節(jié)介紹的 基于驅(qū)動(dòng)程序的的解決方案。y?;隍?qū)動(dòng)程序的解決方方案需要一個(gè)驅(qū)動(dòng)動(dòng)程序管理器(driver manager),這這是與應(yīng)用程序打打交道的界面。驅(qū)驅(qū)動(dòng)程序管理器提提供了一套工業(yè)標(biāo)標(biāo)準(zhǔn)的應(yīng)用程序編編程接口(API),用用于訪問(wèn)數(shù)據(jù)源。應(yīng)應(yīng)用程序調(diào)用這些些 API,然后后被編譯,再與管管理器的庫(kù)鏈接。因因?yàn)轵?qū)動(dòng)程序遵從從標(biāo)準(zhǔn),所以應(yīng)用用程序可以很容易易地使用(或裝載載)正確的驅(qū)動(dòng)程程序來(lái)訪問(wèn)不同供供應(yīng)商的數(shù)據(jù)源。 7。在下面幾小節(jié)中,我們們將看看 DB2 支持的一些 API。在在本系列后面的教教程中,您將更詳詳細(xì)地了解這些 AP

40、I。X。CLI 和 ODBC API DB2 Call Level Interface (CLI) 是是 IBM 對(duì) DB2 數(shù)據(jù)庫(kù)庫(kù)服務(wù)器的可調(diào)用用 SQL 接口口。CLI 是用用于數(shù)據(jù)訪問(wèn)的一一個(gè) C/C+ 應(yīng)用程序編程程接口(API)。您您可以使用 DB2 CLI 開(kāi)發(fā)動(dòng)動(dòng)態(tài)應(yīng)用程序,就就像使用嵌入式動(dòng)動(dòng)態(tài) SQL 語(yǔ)語(yǔ)句進(jìn)行開(kāi)發(fā)一樣樣。在這兩種情況況下,SQL 語(yǔ)語(yǔ)句都是在運(yùn)行時(shí)時(shí)準(zhǔn)備和處理的。嵌嵌入式動(dòng)態(tài) SQL 要求有一個(gè)預(yù)編編譯器,而 DB2 CLI 則沒(méi)有有這種要求。您只只需編譯應(yīng)用程序序,并與 DB2 CLI 驅(qū)動(dòng)程程序庫(kù)鏈接。a。DB2 CLI 是基基于 Microsoft

41、 Open Database Connectivity (ODBC) 和 X/Open CLI 標(biāo)準(zhǔn)的的。在 ODBC 環(huán)境中,應(yīng)用程程序與數(shù)據(jù)庫(kù)服務(wù)務(wù)器之間的聯(lián)系要要通過(guò) ODBC 驅(qū)動(dòng)程序管理器器。該管理器動(dòng)態(tài)態(tài)地加載應(yīng)用程序序需連接的數(shù)據(jù)庫(kù)庫(kù)服務(wù)器所需的驅(qū)驅(qū)動(dòng)程序。ODBC 提供某些級(jí)別的的功能支持,當(dāng)前前的 DB2 CLI 遵從 ODBC 3.51。X。要開(kāi)發(fā) DB2 CLI 應(yīng)用程序,需要要 DB2 Application Development Client。它它包括編譯和鏈接接 CLI 應(yīng)用用程序時(shí)所有必需需的頭文件和庫(kù)。而而要開(kāi)發(fā) ODBC 應(yīng)用程序,則需需要 Microsof

42、t 提供的一個(gè) ODBC Developers Software Kit。m。下面的圖對(duì) DB2 CLI 與 ODBC 環(huán)境作了快速的的比較。Q。OLE DB 與 ADO.NET API Microsoft Object Link Embedded Database (OLE DB) 是一套接口,它它為應(yīng)用程序提供供了對(duì)存儲(chǔ)在不同同信息源上的數(shù)據(jù)據(jù)的統(tǒng)一訪問(wèn),這這些不同的信息源源包括關(guān)系數(shù)據(jù)源源和非關(guān)系數(shù)據(jù)源源。OLE DB 架構(gòu)由 OLE DB 提供者和和 OLE DB 消費(fèi)者組成。DB2 同時(shí)支持這兩種種角色。為了使 DB2 能夠充充當(dāng) OLE DB 提供者,必須要要有 IBM OLE D

43、B Provider for DB2。這這是一個(gè)本地驅(qū)動(dòng)動(dòng)程序,支持通過(guò)過(guò) OLE 接口口提取或查詢 DB2 數(shù)據(jù)。g。下面的圖展示了一個(gè)可可作為 OLE DB 消費(fèi)者的的 DB2 數(shù)據(jù)據(jù)庫(kù),它可以訪問(wèn)問(wèn)來(lái)自任何遵從 OLE DB 的數(shù)據(jù)源(例如如一個(gè)電子表格)的的數(shù)據(jù)。同樣的 DB2 服務(wù)器器也可以作為一個(gè)個(gè) OLE DB 提供者,為 OLE DB 消費(fèi)者提提供數(shù)據(jù)。O。ActiveX Data Object .NET (ADO.NET) 是 Microsoft 提供的另一種數(shù)數(shù)據(jù)訪問(wèn)應(yīng)用程序序接口。它是一種種新的數(shù)據(jù)訪問(wèn)模模型,將其前任(ADO)最最好的特性與傳統(tǒng)統(tǒng)的數(shù)據(jù)庫(kù)訪問(wèn)相相結(jié)合,集

44、成了 XML 支持,是是一種斷開(kāi)連接的的(disconnected)數(shù)數(shù)據(jù)架構(gòu)。有三種種方法從一個(gè) .NET 應(yīng)用程序連接到到一個(gè) DB2 數(shù)據(jù)庫(kù),如下圖圖所示。 I。JDBC 和 SQLJ API 至今為止,Java 平臺(tái)已經(jīng)享譽(yù)多多時(shí),但仍有很多多人正在致力于擴(kuò)擴(kuò)展其功能和提高高其性能。訪問(wèn)和和操縱 DB2 的 Java 程序可以使用 Java Database Connectivity (JDBC) API,以及 Embedded SQL for Java (SQLJ) 標(biāo)準(zhǔn)。這兩個(gè)個(gè)選項(xiàng)都是供應(yīng)商商無(wú)關(guān)的 SQL 接口,通過(guò)標(biāo)準(zhǔn)準(zhǔn)化的 Java 方法為應(yīng)用程序序提供數(shù)據(jù)訪問(wèn)。y。JDB

45、C 是用于關(guān)系系數(shù)據(jù)庫(kù)訪問(wèn)的 實(shí)際上的 標(biāo)準(zhǔn)準(zhǔn) Java API,這這種訪問(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ò) JDBC API 執(zhí)行 SQL 語(yǔ)句,結(jié)結(jié)果被傳回給 Java 代碼。JDBC 類似于 DB2 CLI,您無(wú)需需預(yù)編譯或綁定 JDBC 程序序,因?yàn)?JDBC 使用動(dòng)態(tài) SQL。Z。而 SQLJ 程序則則包含靜態(tài)嵌入式式 SQL 語(yǔ)句句。準(zhǔn)備一個(gè) SQLJ 程序時(shí)需要通過(guò)過(guò)類似于預(yù)編譯和和綁定的步驟。在在編譯 SQLJ 源文件之前,必必須用 SQLJ 翻譯器對(duì)其進(jìn)行行翻譯,以創(chuàng)建本本地 Java 源代碼。完成翻翻譯后,需要使用用 DB2 for Java profile customizer (db2profc) 創(chuàng)建 DB2 包。w。DB2 遺留的基于CLI 的 JDBC 驅(qū)動(dòng)程序 根據(jù) Java 2 Platform, Enterprise Edition (J2EE) 規(guī)范,用于獲得得數(shù)據(jù)訪問(wèn)的 Java 方法和接口可以以打包成 JDBC 驅(qū)動(dòng)程序。D

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論