




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、DB2數據庫對象基本數據庫對象 數據庫對象是一個數據據庫的構造塊(building block)。DB2 提供了不同類型型的數據庫對象來來存儲和表示不同同信息。通過使用用數據定義語言(DDL),可可以創(chuàng)建、修改和和刪除數據庫對象象。要操縱數據庫庫對象,可以使用用數據操縱語言(DML),例例如 SELECT、UPDATE、INSERT 和 SELECT 語句。常用的數數據庫對象有:x。表 用戶定義數據類型 約束 視圖 索引 除了 Family Fundamentals 教程里介紹的一一些數據庫對象外外,還有一些其他他的對象,很多開開發(fā)人員在開發(fā) DB2 應用程程序時會發(fā)現這些些對象比較有用。本本
2、節(jié)我們將介紹這這些對象。v。在繼續(xù)之前,有一點要要注意:在下面看看到的一些例子中中,對象名稱是以以小寫形式指定的的。無論 DB2 在哪個平臺上運運行,它總是以大大寫形式存儲名稱稱,除非標識符的的名稱以雙引號()括起來了。R。例如,下面的語句創(chuàng)建建一個名為 employee(小小寫)的表,該表表的列定義與表 EMPLOYEE(大大寫)是一樣的。8。CREATE TABLE employee LIKE employeez。別名 別名(alias) 是指一個已有的的表、視圖的另一一個名稱,也叫昵昵稱(nickname)。別別名也可以作為另另一個別名的昵稱稱。與這些對象一一樣,別名也可以以被創(chuàng)建或刪除
3、,可可以有與之相關的的注釋。下面是 CREATE ALIAS 語語句的一些例子: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 語語句比較簡單。可可以在源對象所在在的同一模式中創(chuàng)創(chuàng)建別名(如第 1 行),或者者也可以全限定別別名(如第 2 行)。為了與 DB2 for zSeries 兼容,使用關鍵鍵字 SYNONYM 代替 ALIAS 也是合法的(如如第
4、 3 行)。A。使用別名時無需專門的的授權或權限。不不過,需要獲得與與別名所引用的底底層對象相關的授授權。關于數據庫庫對象權限的完整整清單,請參考 DB2 DBA 認證教程 Server management(請請參閱 參考資料料)。e。前面已提到,我們也可可以為 昵稱 創(chuàng)創(chuàng)建別名。昵稱是是引用位于聯邦系系統(tǒng)上的數據表或或視圖的數據庫對對象。聯邦數據庫庫支持超出了本教教程的范圍。在本本教程系列的第 2 部分,Data manipulation ,我們將學習更更多有關聯邦系統(tǒng)統(tǒng)的知識。M。要為別名添加注釋,可可以發(fā)出以下語句句:COMMENT ON aliastab1 IS My first a
5、lias on tab1r。要刪除一個別名,使用用 DROP 語語句,這與所有其其他數據庫對象是是一樣的:v。DROP ALIAS aliastab1序列對象 序列(sequence)是是一種數據庫對象象,這種對象允許許自動生成值。序序列對象與標識列列(identity column)不不同,標識列是要要與一個特定的表表綁在一起的,而而序列是一種全局局的、獨立的對象象,同一個數據庫庫中的任何表都可可以使用它。X。標識列是序列對象的一一種特例。因此,標標識列的特征也適適用于序列對象。下下面就例釋了一條條 CREATE SEQUENCE 語句:n。CREATE SEQUENCE myseq AS
6、INTEGERA。 START WITH 360 INCREMENT BY 10 NO MAXVALUE CYCLE CACHE 20 任何包括 0 在內的的數字數據類型都都可用于序列值。這這些類型包括 SMALLINT、INTEGER、BIGINT 或 DECIMAL。基基于這些數據類型型的任何用戶定義義獨特類型(distinct type)也都都可以用于序列值值。這進一步擴展展了用戶定義獨特特類型在應用程序序中的使用。 q。如上面的例子所示,您您可以為序列對象象指定起始值,從從而自定義序列對對象。在這個例子子中,序列的第一一個值是 360。后后續(xù)值的生成是由由 INCREMENT BY 子
7、句控制制的。這里還支持持正、負常量,以以產生升序和降序序值。 3。缺省情況下,一個序列列所生成的最小值值和最大值是由該該序列數據類型的的取值范圍來界定定的。例如,INTEGER 類型的序列值必必須處在 -2,147,483,647 到 2,147,483,647 之間的范圍內。在在 DB2 SQL Reference Guide 中中可以找到所有數數字數據類型的取取值范圍。為了改改變這種缺省行為為,可以使用 MINVALUE 和 MAXVALUE 選項來為生成的的值設置一個邊界界。如果達到了最最小值或最大值,那那么可以使用另一一個選項,即 CYCLE 或 NO CYCLE 來規(guī)定序列值是是否應
8、該循環(huán)。注注意,如果 CYCLE 生效,則序列就就可以生成重復的的值。j。CACHE 選項允許許 DB2 將一一些預先分配好空空間的值保留在內內存中,以提高性性能。CACHE 20 是缺省的的行為。關于這個個選項有一點要謹謹記:如果在所有有緩存的值被使用用之前關閉 DB2,那那么任何緩存的值值和未使用的值都都將被丟棄。當 DB2 重新啟啟動時,又會生成成和緩存下一塊的的值,從而造成值值之間的不連續(xù),即即值之間存在間隔隔。如果應用程序序不允許值之間有有間隔,可以考慮慮使用 NOCACHE 選項。o。如果沒有使用緩存,則則性能就會下降,因因為要頻繁地生成成序列數字。每當當生成一個新值的的時候,都會
9、寫下下一條日志記錄。因因此,更高效的做做法是根據請求來來獲取值,并將這這些值緩存在內存存中。J。通過 ALTER SEQUENCE 語句,可以更改改序列對象的特征征。除了序列值的的數據類型以外,上上面所討論的所有有的設置都可以修修改。要獲得完整整的語法,請參考考 DB2 SQL Reference Guide (請請參閱 參考資料料)。W。刪除一個序列對象與刪刪除任何其他的數數據庫對象是一樣樣的,不同之處是是這里還要使用到到一個 RESTRICT 關鍵字。這樣可可以防止在有依賴賴的情況下刪除序序列。9。DROP SEQUENCE myseq RESTRICT生成和獲取序列值 序列是一種數據庫對
10、象象,因此對序列的的訪問也是由權限限來控制的。缺省省情況下,只有序序列的創(chuàng)建者,即即 SYSADM 和 DBADM 擁有該對象的 USAGE 權權限。如果希望其其他用戶也能夠使使用序列,則需要要使用下面的語句句:W。GRANT USAGE ON SEQUENCE seq_object_name TO PUBLICU。有兩種表達式可用于生生成和獲取序列值值。NEXTVAL FOR seq-name 用于于獲取下一個序列列值,而 PREVVAL FOR seq-name 則用用于獲取上一個生生成的序列值。下下面的例子例釋了了這些表達式的使使用。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。假設我們以一個空表 t1 開始,myseq 的下一個序列值值是 1。如果禁禁用了 autocommit,則則在執(zhí)行上述語句句之后,t1 將將包
12、含下面幾行:G。1NAME-1BOB2PAT4PAUL 3 record(s) selected.雖然為 GENE 生生成的值被回滾了了,但是 DB2 并沒有再次使用用它。因而,下一一個為 PAUL 生成的序列值就就是 4,而不是是 3。 e。這個例子中的最后一條條語句展示了如何何使用 PREVVAL 表達式。宿主變變量 :hostvar 存儲當前會話中中生成的最后一個個值。如果想保存存前面生成的值,那那么應該在生成下下一個值之前保存存 PREVVAL 值。j。臨時表 顧名思義,臨時表(temporary table)不不是永久性的數據據庫對象。臨時表表與普通的表在行行為上是一樣的,不不同之處
13、是,并非非所有的功能和選選項都是受支持的的和/或是必需的的。臨時表只能維維持在一次連接期期間。當連接關閉閉時,在此連接內內聲明的所有臨時時表都將自動刪除除掉。 V。只有聲明臨時表的會話話或應用程序才能能訪問臨時表。如如果兩個應用程序序用相同的名字創(chuàng)創(chuàng)建了一個臨時表表,該臨時表的每每個實例仍然是惟惟一的。因而,完完全不必擔心出現現臨時數據沖突的的情況。由于臨時時表只允許單連接接(single-connection)訪訪問,因此這里無無需使用鎖。這正正是臨時表的一個個主要的性能優(yōu)勢勢。U。聲明臨時表 要聲明一個臨時表,必必須存在一個 USER 臨時表空間(不不同于 SYSTEM 臨時表空間),用用
14、以存儲臨時表的的定義和內容。SYSTEM 臨時表空間只是是 DB2 在內內部用來執(zhí)行諸如如排序之類操作的的。下面這條簡單單的語句將創(chuàng)建一一個用戶臨時表空空間。o。CREATE USER TEMPORARY TABLESPACE usertempspaceB。 MANAGED BY SYSTEM USING (usertempspace)1。聲明全局臨時表時,可可以使用很多可選選子句。下面的例例子對這些子句的的特性作了說明。Z。DECLARE GLOBAL TEMPORARY TABLE t_dept L。( deptid CHAR(6), deptname CHAR(20) )z。ON COM
15、MIT DELETE ROWS NOT LOGGEDIN usertempspace在這個例子中,聲明了了臨時表 t_dept,這這個表有兩列。ON COMMIT DELETE ROWS 子句句規(guī)定在每次執(zhí)行行 COMMIT 操作時刪除臨時時表的內容。在 DB2 V8 中,可以選擇記記錄對臨時表的更更改,以便回滾。這這個例子規(guī)定對該該表的更改是 NOT LOGGED。這這意味著對該表的的任何操作,包括括創(chuàng)建以及更改,都都不做日志記錄。如如果在一個工作單單位內創(chuàng)建表,然然后回滾,則臨時時表將被刪除。另另一方面,如果在在此工作單位內刪刪除該表,則該表表在恢復時將沒有有任何行。U。無需使用 IN 子
16、句句來指定該臨時表表將要使用的用戶戶臨時表空間。如如果沒有指定該信信息,DB2 就就會搜索最適用的的表空間。如果找找不到用戶臨時表表空間,DB2 將產生一個錯誤誤。1。讓我們看看另一個例子子:DECLARE GLOBAL TEMPORARY TABLE t_proj a。 LIKE project ON COMMIT PRESERVE ROWS WITH REPLACE IN usertempspace臨時表 t_proj 是用 LIKE 關鍵字聲明的,因因此它擁有與名為為 project 的持久表或視圖圖相同的列定義。ON COMMIT PRESERVE ROWS 子句句表明,在執(zhí)行 COM
17、MIT 語句時,該臨時時表中的所有行都都將被保留。因此此,這些行就可以以在下一次事務中中用于進一步的處處理。A。在同一次會話中使用相相同的名稱聲明另另一個臨時表之前前,首先必須刪除除該臨時表??梢砸燥@式地刪除該表表,也可以像這里里一樣使用 WITH REPLACE 選項。如果使用用了 WITH REPLACE 選項,DB2 將隱式地刪除所所有數據,刪除該該臨時表,并用新新的定義重新創(chuàng)建建該臨時表。U。如果使用了 連接池(connection pooling),WITH REPLACE 選項用起來就十十分方便了。連接接池是用于重用數數據庫連接的一種種機制,這樣就不不必完全按照要求求分配和回收資源
18、源。這些操作的開開銷都是相當大的的,尤其是在有大大量執(zhí)行很短事務務的連接時,更是是如此。由于沒有有釋放連接,先前前使用的臨時表就就可能得不到清除除。下一個使用該該連接的應用程序序就可能使用上一一次執(zhí)行時遺留下下來的數據。因此此,使用 WITH REPLACE 選項可以保證用用新的定義刷新所所聲明的臨時表。S。模式與數據庫對象 大多數數據庫對象都是是用一個 模式(schema) 和一個 對象名名(object name)標識識的。數據庫模式式為數據庫對象提提供邏輯上的分類類。下面例釋了這這種分為兩部分的的對象名:F。DB2ADMIN.EMPLOYEEHRPROD.AUDIT_VIEWHRPROD
19、.AUDIT_TRIG如果在訪問數據庫對象象時沒有指定模式式,則用于建立數數據庫連接的用戶戶 ID 將被設設為缺省的模式。例例如,如果用戶 db2admin 連接到一個數據據庫,并創(chuàng)建表 T1,則 DB2 將創(chuàng)建一個名為為 db2admin.T1 的表。此后所有有引用非全限定(unqualified)表表名 T1 的 SQL 語句都都解析為 db2admin.T1。q。DB2 專用寄存器:CURRENT SCHEMA 您在進行自己的數據庫庫工作時可能已經經發(fā)現,用同為對對象的模式的用戶戶 ID 連接到到一個數據庫并非非總是可行的。而而硬編碼(hard-coding)應應用程序以完全限限定對象也
20、不是最最好的解決辦法。幸幸運的是,DB2 允許使用 SET CURRENT SCHEMA 命令更改當前模模式。缺省情況下下,CURRENT SCHEMA DB2 專用寄寄存器被設置為連連接到數據庫的 USER。如果果更改 CURRENT SCHEMA,那那么任何非全限定定的數據庫對象都都會在前面加上新新的值。I。當前模式可以通過下面面這個命令獲得:VALUES CURRENT SCHEMA要對它進行更改,只需需使用下面的命令令:SET SCHEMA=db2adminDB2應用程序開發(fā)數數據庫對象例程 在本節(jié)中,我們將介紹紹更多類型的數據據庫對象。這些對對象統(tǒng)統(tǒng)都叫做 例程(routine)。從
21、從功能上分,主要要有三種例程:存存儲過程(stored procedure)、函數(function)和和方法(method)。(要要了解這些類型之之間的更多不同之之處,請參閱 存存儲過程、函數和和方法。)9。例程是封裝了與某一特特定任務相關的編編程和數據庫邏輯輯的數據庫對象。有有效地使用例程可可以簡化應用程序序的代碼,并增加加代碼的可重用性性。例如,如果將將某種業(yè)務邏輯封封裝在一個例程中中,那么對此業(yè)務務規(guī)則的更改只會會影響那個特定的的例程。從而可最最小化對應用程序序的更改。6。例程是在數據庫服務器器上定義和處理的的。這樣就允許應應用程序利用數據據庫服務器的能力力,從而減少客戶戶機上的處理負
22、載載。2。通常,復雜的業(yè)務邏輯輯需要多條 SQL 語句。這些語句句要分別地從客戶戶機發(fā)送到服務器器,如果數據庫活活動很多,就會產產生大量的網絡傳傳輸。如果將這些些操作放在一個例例程中,那么客戶戶機和服務器之間間的網絡傳輸就會會大大減少,從而而可以提高應用程程序的總體性能。X。加強安全的能力是使用用例程的另一個關關鍵優(yōu)勢。例程可可用于屏蔽對底層層數據庫對象的直直接訪問。用 EXECUTE 權限調用一個例例程就足夠了,無無需擁有訪問底層層數據庫對象的顯顯式的權限。0。例程的不同實現 例程有幾種可能的實現現:內置(built-in)例例程是 DB2 系統(tǒng)附帶的。這這些例程定義在一一個系統(tǒng)模式中,例例
23、如 SYSIBM、SYSPROC、SYSFUN 和 SYSTOOLS。 9。Sourced 例程程只適用于函數。sourced 例程復制另一個個函數的語義。 w。外部(external)例例程是用一種外部部的編程語言實現現的。對于 DB2 V8.1,可以以用下列受支持的的語言開發(fā)例程: o。Java 語言 C/C+ OLE(僅用于存儲過過程) OLE DB(僅用于于表函數) SQL 例程是用 SQL Procedural Language (SQL PL)實實現的。DB2 SQL PL 是 SQL Persistent Stored Modules (SQL/PSM) 語言標準的一一個子集。該
24、標準準是與 SQL 一起用來編寫存存儲過程、函數和和方法的結構化編編程語言的基礎。它它將 SQL 數數據訪問的容易性性與簡單編程語言言的流控制結構相相結合。這就是 SQL PL 如此流行的一個個主要原因。M。存儲過程、函數和方法法 存儲過程 是一種數據據庫對象,它包含含用于訪問和修改改一個或多個表中中數據的專門程序序。在一個存儲過過程內,可以以一一定的流邏輯包裝裝多條 SQL 語句。存儲過程程可以作為對客戶戶機應用程序或其其他例程的子例程程擴展。存儲過程程的執(zhí)行和管理是是由一個關系數據據庫管理系統(tǒng)(RDBMS)控控制的。K。函數 是可以自定義的的 SQL 擴展展??梢栽?SQL 語句(例如一個
25、個 select-list 或 FROM 子句句)中調用函數。有有四種類型的函數數:聚合(aggregate)函函數、標量(scalar)函函數、行(row)函函數以及 表(table)函函數。 n。存儲過程通常用于封裝裝復雜的應用程序序邏輯,以及執(zhí)行行開銷較大的數據據庫操作,例如多多表聯結和游標操操作。而函數 尤其是 SQL 函數 通常包含更更簡單的操作。編編寫在 SQL 函數中的語句將將展開到引用它們們的 SQL 語語句中,與這些 SQL 語句一一起執(zhí)行。這導致致這些語句在執(zhí)行行時動態(tài)編譯。如如果一條 SQL 語句中使用了一一個復雜的 SQL 函數,則 DB2 要求使用附加的的資源來編譯它
26、,并并生成一個數據訪訪問計劃。這樣將將影響整個運行時時性能。 a。方法 用于封裝為結構構類型提供行為的的邏輯,結構類型型包含一個或多個個指定的屬性,各各屬性有其自己的的數據類型。p。DB2 專用寄存器:CURRENT PATH 與大多數 DB2 數數據庫對象一樣,一一個完整的例程名名由一個模式和一一個例程名組成。 DB2 專用寄寄存器 CURRENT SCHEMA可可以為大多數數據據庫對象解析模式式,但不能為例程程解析模式。相反反,DB2 是使使用 CURRENT PATH 專用用寄存器來定位例例程的。n。通過下面的命令可以獲獲得 CURRENT PATH 設置置:VALUES CURRENT
27、 PATH缺省路徑包含三個系統(tǒng)統(tǒng)模式,后面跟有有連接到數據庫的的當前用戶。例如如:6。SYSIBM,SYSFUN,SYSPROC,DB2ADMINT。下面是一些例子和技巧巧,您可以用它們們來更新 PATH:SET PATH=CURRENT PATH,USER2VALUES CURRENT PATH-SYSIBM,SYSFUN,SYSPROC,DB2ADMIN,USER2e。1 record(s) selected.嵌入式 SQL 程序序嵌入式 SQL 簡介介 DB2 為開發(fā)人員提提供了不同的編程程方法來編寫應用用程序。最直接的的一種方法是嵌入入式 SQL 編編程。這種編程方方法是 直接的,因因
28、為程序嵌入了直直接與 DB2 交互的 SQL 語句。程序可以以用下列受支持的的編程語言中的任任何一種來編寫:6。C/C+ FORTRAN COBOL Java 語言 (SQLJ) 如何構造嵌入式 SQL 語句取決于所選選擇的編程語言。C/C+ 和 FORTRAN 中的嵌入式 SQL 語句前面要加上上 EXEC SQL 關鍵字:T。EXEC SQL SELECT lastname,empid INTO :hostvar1, :hostvar2 i。FROM employee WHERE deptno=OPERATIONS;t。COBOL 中的嵌入入式 SQL 語語句非常類似于 C/C+ 中中的那
29、些嵌入式 SQL 語句,不不同的是在語句的的后面要使用 END-EXEC 關鍵鍵字:4。EXEC SQL SELECT lastname,empid INTO :hostvar1, :hostvar2 m。 FROM employee WHERE deptno=OPERATIONS END-EXEC;p。Java 語言中的嵌嵌入式 SQL 語句與前面兩個個例子中展示的那那些嵌入式 SQL 語句稍微有些不不同,這里必須指指定語句將來執(zhí)行行時所在的連接上上下文。下面是一一個例子:8。#sql myConnCtx SELECT lastname, empid INTO :hostvar1, :hos
30、tvar2 P。 FROM employee WHERE deptno=OPERATIONS;9。為了讓您更好地了解嵌嵌入式 SQL 語句是什么樣子子的,下面給出了了用 C 編寫的的一個程序的代碼碼片斷。在本系列列(請參閱 參考考資料)的第 3 篇教程中,您將將了解到更多關于于程序預編譯和實實際代碼開發(fā)的知知識。 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 語句:靜態(tài)嵌入入式 SQL 和和動態(tài)嵌入式 SQL。u。這個例子中的 SELECT 語句說明了靜態(tài)態(tài) SQL 的使使用。編寫靜態(tài) SQL 時,必必須指定完整的語語句。表名、列名名以及所引用的數數據類型都是已知知的。惟一可以在在運行時指定的信信息是使用宿主變變量的 SQL 語句的 WHERE 子句中的值。2。編譯靜態(tài) SQL 語語句(或者,用 DB2 術語更更確切地說,準備備好的(prepared)SQL 語句)時,將為為其生成數據訪問問計劃,并存儲在在數據庫中的一個個包里面。當調用用包含該語句的應應用程序時,這個個包
34、將被執(zhí)行。由由于在運行時不需需要編譯語句,因因此執(zhí)行靜態(tài) SQL 時沒用編譯開銷銷。b。在準備語句時,DB2 使用數據庫統(tǒng)計計信息和配置參數數來估計和獲得訪訪問計劃。如果數數據庫統(tǒng)計信息有有變化,則預先生生成的訪問計劃可可能不如一開始生生成時那樣是最佳佳的。k。創(chuàng)建包和將包與數據庫庫綁定時,要對準準備靜態(tài) SQL 語句的人進行授授權。只要執(zhí)行包包的人擁有包的 EXECUTE 權限,他就不需需要具備該包中所所引用的數據庫對對象上的顯式的權權限。m。動態(tài) SQL 動態(tài)(Dynamic SQL) 語句句是在運行時動態(tài)態(tài)處理的。語句的的結構直到執(zhí)行應應用程序時才需要要。D。注意,嵌入式 SQL 簡介
35、中展示的的例子 SQL 語句使用動態(tài) SQL 來 PREPARE 和 EXECUTE 一條 DELETE 語句。DELETE 語句的文本存儲儲在一個宿主變量量 hostVarStmt 中。當該語句 PREPARE 好后,系統(tǒng)將生生成該語句的一個個可執(zhí)行格式,并并將其存儲在數據據庫中的一個包里里面。一旦生成了了數據訪問計劃,準準備好的語句就可可以 EXECUTE 了。聽起來好像像有點熟悉,不是是嗎?是的:這兩兩個處理階段與靜靜態(tài) SQL 語語句正好是一樣的的。惟一的不同點點是,動態(tài) SQL 的 PREPARE 和 EXECUTE 都是在運行時進進行,而靜態(tài) SQL 在預編譯時準備備訪問計劃,并將
36、將其保存在數據庫庫中。i。動態(tài) SQL 語句必必須總是在執(zhí)行之之前準備好,不管管是否有相同的語語句(相同的訪問問計劃)一次又一一次地重復使用。為為了最小化這些準準備工作的開銷,DB2 提供了 包緩存存(也叫 動態(tài)查查詢緩存),用以以將經常使用的訪訪問計劃保存在內內存中。包緩存(package cache)明明顯地減少了重復復的 SQL 準準備請求的代價,然然而發(fā)起和響應準準備請求的開銷仍仍然存在。E。在準備語句時,總是使使用當前數據庫統(tǒng)統(tǒng)計信息。因此,就就可以生成最佳的的數據訪問路徑。2。SQL 語句的授權是是在運行時決定的的。執(zhí)行應用程序序的人必須有適當當的權限來訪問語語句中所引用的數數據庫
37、對象。下一一小節(jié)將更詳細地地討論 DB2 權限。W。安全考慮 要預編譯嵌入式靜態(tài) SQL 程序,用用戶需要程序中所所引用數據庫對象象的顯式的權限。由由于預編譯或 PREPARE 階段會生成一個個包,并將其存儲儲在數據庫中,因因此該用戶還必須須擁有 BINDADD 權限,以便添加加新的包到數據庫庫中。為了執(zhí)行帶帶有靜態(tài) SQL 的程序,用戶只只需具有相關包上上的 EXECUTE 權限。i。編譯嵌入式動態(tài) SQL 程序的用戶也需需要 BINDADD 權限。這里不再再需求其他的權限限,因為動態(tài) SQL 不是在編譯時準準備的。在程序執(zhí)執(zhí)行時,用戶需要要所有必需的權限限來發(fā)出每條 SQL 語句,同時還需
38、需要為嵌入式 SQL 程序創(chuàng)建的包上上的 EXECUTE 權限。x。下面的表總結了預編譯譯和執(zhí)行一個只有有靜態(tài) SQL 或只有動態(tài) SQL 的程序所需的權權限。 p。靜態(tài) SQL 與動態(tài)態(tài) SQL在下面的表中,讓我們們總結并詳細闡述述我們所學到的關關于靜態(tài) SQL 和動態(tài) SQL 的知識:L?;隍寗映绦虻?API基于驅動程序的 API雖然大多數供應商都支支持嵌入式 SQL 數據庫訪問,但但如果您想要使用用同樣的源代碼,并并將嵌入式 SQL 應用程序部署到到多個數據庫系統(tǒng)統(tǒng)上,那么還需要要一個額外的工作作。必須用不同供供應商的特定的預預編譯器預編譯程程序。還必須生成成數據訪問計劃,并并綁定到目
39、標數據據庫。為了增加應應用程序的可移植植性,還應考慮使使用本節(jié)介紹的 基于驅動程序的的解決方案。y?;隍寗映绦虻慕鉀Q方方案需要一個驅動動程序管理器(driver manager),這這是與應用程序打打交道的界面。驅驅動程序管理器提提供了一套工業(yè)標標準的應用程序編編程接口(API),用用于訪問數據源。應應用程序調用這些些 API,然后后被編譯,再與管管理器的庫鏈接。因因為驅動程序遵從從標準,所以應用用程序可以很容易易地使用(或裝載載)正確的驅動程程序來訪問不同供供應商的數據源。 7。在下面幾小節(jié)中,我們們將看看 DB2 支持的一些 API。在在本系列后面的教教程中,您將更詳詳細地了解這些 AP
40、I。X。CLI 和 ODBC API DB2 Call Level Interface (CLI) 是是 IBM 對 DB2 數據庫庫服務器的可調用用 SQL 接口口。CLI 是用用于數據訪問的一一個 C/C+ 應用程序編程程接口(API)。您您可以使用 DB2 CLI 開發(fā)動動態(tài)應用程序,就就像使用嵌入式動動態(tài) SQL 語語句進行開發(fā)一樣樣。在這兩種情況況下,SQL 語語句都是在運行時時準備和處理的。嵌嵌入式動態(tài) SQL 要求有一個預編編譯器,而 DB2 CLI 則沒有有這種要求。您只只需編譯應用程序序,并與 DB2 CLI 驅動程程序庫鏈接。a。DB2 CLI 是基基于 Microsoft
41、 Open Database Connectivity (ODBC) 和 X/Open CLI 標準的的。在 ODBC 環(huán)境中,應用程程序與數據庫服務務器之間的聯系要要通過 ODBC 驅動程序管理器器。該管理器動態(tài)態(tài)地加載應用程序序需連接的數據庫庫服務器所需的驅驅動程序。ODBC 提供某些級別的的功能支持,當前前的 DB2 CLI 遵從 ODBC 3.51。X。要開發(fā) DB2 CLI 應用程序,需要要 DB2 Application Development Client。它它包括編譯和鏈接接 CLI 應用用程序時所有必需需的頭文件和庫。而而要開發(fā) ODBC 應用程序,則需需要 Microsof
42、t 提供的一個 ODBC Developers Software Kit。m。下面的圖對 DB2 CLI 與 ODBC 環(huán)境作了快速的的比較。Q。OLE DB 與 ADO.NET API Microsoft Object Link Embedded Database (OLE DB) 是一套接口,它它為應用程序提供供了對存儲在不同同信息源上的數據據的統(tǒng)一訪問,這這些不同的信息源源包括關系數據源源和非關系數據源源。OLE DB 架構由 OLE DB 提供者和和 OLE DB 消費者組成。DB2 同時支持這兩種種角色。為了使 DB2 能夠充充當 OLE DB 提供者,必須要要有 IBM OLE D
43、B Provider for DB2。這這是一個本地驅動動程序,支持通過過 OLE 接口口提取或查詢 DB2 數據。g。下面的圖展示了一個可可作為 OLE DB 消費者的的 DB2 數據據庫,它可以訪問問來自任何遵從 OLE DB 的數據源(例如如一個電子表格)的的數據。同樣的 DB2 服務器器也可以作為一個個 OLE DB 提供者,為 OLE DB 消費者提提供數據。O。ActiveX Data Object .NET (ADO.NET) 是 Microsoft 提供的另一種數數據訪問應用程序序接口。它是一種種新的數據訪問模模型,將其前任(ADO)最最好的特性與傳統(tǒng)統(tǒng)的數據庫訪問相相結合,集
44、成了 XML 支持,是是一種斷開連接的的(disconnected)數數據架構。有三種種方法從一個 .NET 應用程序連接到到一個 DB2 數據庫,如下圖圖所示。 I。JDBC 和 SQLJ API 至今為止,Java 平臺已經享譽多多時,但仍有很多多人正在致力于擴擴展其功能和提高高其性能。訪問和和操縱 DB2 的 Java 程序可以使用 Java Database Connectivity (JDBC) API,以及 Embedded SQL for Java (SQLJ) 標準。這兩個個選項都是供應商商無關的 SQL 接口,通過標準準化的 Java 方法為應用程序序提供數據訪問。y。JDB
45、C 是用于關系系數據庫訪問的 實際上的 標準準 Java API,這這種訪問通過強大大的面向對象的接接口,使用動態(tài) SQL。JDBC 將動態(tài) SQL 傳遞給 DB2 附帶的一個 JDBC 驅動程序。DB2 通過 JDBC API 執(zhí)行 SQL 語句,結結果被傳回給 Java 代碼。JDBC 類似于 DB2 CLI,您無需需預編譯或綁定 JDBC 程序序,因為 JDBC 使用動態(tài) SQL。Z。而 SQLJ 程序則則包含靜態(tài)嵌入式式 SQL 語句句。準備一個 SQLJ 程序時需要通過過類似于預編譯和和綁定的步驟。在在編譯 SQLJ 源文件之前,必必須用 SQLJ 翻譯器對其進行行翻譯,以創(chuàng)建本本地 Java 源代碼。完成翻翻譯后,需要使用用 DB2 for Java profile customizer (db2profc) 創(chuàng)建 DB2 包。w。DB2 遺留的基于CLI 的 JDBC 驅動程序 根據 Java 2 Platform, Enterprise Edition (J2EE) 規(guī)范,用于獲得得數據訪問的 Java 方法和接口可以以打包成 JDBC 驅動程序。D
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個人信用報告服務行業(yè)深度調研及發(fā)展項目商業(yè)計劃書
- 人教版-七年級思想品德(上)教學計劃
- 小學科學學習策略與復習計劃
- 茶葉倉儲物流與茶葉包裝設計合同
- 海外別墅度假租賃與旅游度假合同
- 虛擬現實技術應用許可及知識產權保護協(xié)議
- 購物中心品牌專柜租賃與品牌推廣服務協(xié)議
- 污水處理廠設備安裝施工流程
- 網店跨平臺遷移及物流配送保障協(xié)議
- 日韓跨境電商跨境電商保險股權合作
- 1.3 科學的世界觀和方法論 課件-高中政治統(tǒng)編版必修四哲學文化
- 慢性腎臟病肌少癥診斷治療與預防專家共識(2024年版)解讀
- 砸墻拆除合同
- 初級會計師考試歷年真題試題及答案
- 汽車制造業(yè)產品質量管理措施
- 中國老年患者術后譫妄防治專家共識
- 科學上海會考試卷及答案
- 中小學校園安全風險防控規(guī)范操作手冊與案例分析
- 大模型備案-落實算法安全主體責任基本情況-XX集團有限公司
- 封閉管理的疫情防控課件
- 門診口腔院培訓
評論
0/150
提交評論