您是 DB2 應(yīng)用程序開(kāi)發(fā)新手嗎?有了此實(shí)用指南,您將立刻掌握 DB2 的習(xí)慣與文化。
如果您已經(jīng)習(xí)慣了基于一種數(shù)據(jù)庫(kù)開(kāi)發(fā)應(yīng)用程序,那么切換到不同的數(shù)據(jù)庫(kù)就像是到本國(guó)的另一個(gè)地區(qū)去旅行一樣。基本語(yǔ)言雖然差不多,但是很可能不熟悉當(dāng)?shù)氐姆窖浴?/p>
當(dāng)與那些將自己的應(yīng)用程序從其他供應(yīng)商的產(chǎn)品遷移到 DB2 Universal Database(DB2 UDB)的人們一起工作時(shí),我發(fā)現(xiàn)如果他們一開(kāi)始能掌握 DB2 環(huán)境特有的一些基本概念和術(shù)語(yǔ),就可以取得更大的成功。
這里是特定于 DB2 應(yīng)用程序開(kāi)發(fā)的幾個(gè)關(guān)鍵概念的快速指南。關(guān)于更詳細(xì)的探索,請(qǐng)參閱 DB2 Application Development Certification Guide(Prentice Hall,2000 年)、DB2 Application Development Guide(可在 ibm.com/software/ data/db2/udb/ ad/v7/adg.html上獲取)和 Application Building Guide( ibm.com/software/ data/db2/java/ v6/abg.html)。
嵌入式 SQL
DB2 通過(guò)其預(yù)編譯器支持 C、C++、Java(SQLJ 和 Java 數(shù)據(jù)庫(kù)連接)、COBOL 和 FORTRAN。您可以采用其中一種宿主編程語(yǔ)言編寫(xiě)包含 SQL 語(yǔ)句的應(yīng)用程序。嵌入在應(yīng)用程序中的 SQL 語(yǔ)句提供到數(shù)據(jù)庫(kù)的接口,宿主語(yǔ)言為應(yīng)用程序的執(zhí)行提供必要的支持。而 DB2 預(yù)編譯器可以將 SQL 語(yǔ)法直接轉(zhuǎn)換為 DB2 運(yùn)行時(shí)服務(wù)應(yīng)用程序編程接口(API)調(diào)用。
靜態(tài) SQL
嵌入式靜態(tài) SQL 和嵌入式動(dòng)態(tài) SQL 都要用到 DB2 預(yù)編譯處理。然而,在已知數(shù)據(jù)庫(kù)將被查詢(xún)哪些問(wèn)題時(shí)(例如,在航空訂票系統(tǒng)中),就可以使用靜態(tài) SQL 語(yǔ)句。對(duì)于靜態(tài) SQL 語(yǔ)句,在進(jìn)行預(yù)編譯之前就知道 SQL 語(yǔ)句的類(lèi)型以及表的列名。而未知的元素是語(yǔ)句進(jìn)行搜索或更新的特定數(shù)據(jù)值,并且這些值是用宿主語(yǔ)言變量來(lái)表示的。宿主變量包含的是數(shù)據(jù),而不是 SQL 語(yǔ)句。在運(yùn)行應(yīng)用程序之前要準(zhǔn)備或者構(gòu)建靜態(tài) SQL 語(yǔ)句。
清單 1 展示了 C 程序中的樣本嵌入式靜態(tài) SQL。請(qǐng)注意容納數(shù)據(jù)的宿主變量(例如, EXEC SQL FETCH
c1 INTO :pname, :dept;
)和由 EXEC SQL
為預(yù)編譯目的而分隔的 SQL 語(yǔ)句的用法。
為了使用包含嵌入式 SQL 的程序,不僅要進(jìn)行典型的準(zhǔn)備步驟(編譯、鏈接和運(yùn)行),還必須執(zhí)行 DB2 預(yù)編譯和綁定步驟(見(jiàn) 圖 1)。而這些步驟將為數(shù)據(jù)庫(kù)管理器創(chuàng)建執(zhí)行時(shí)需要的程序包:
1. 預(yù)編譯:將嵌入式 SQL 源語(yǔ)句轉(zhuǎn)換為數(shù)據(jù)庫(kù)管理器可使用的形式。
2. 編譯和鏈接:創(chuàng)建必要的目標(biāo)模塊。
3. 綁定:創(chuàng)建運(yùn)行程序時(shí)數(shù)據(jù)庫(kù)管理器將使用的程序包。
預(yù)編譯器(帶有 BINDFILE 和 PACKAGE 選項(xiàng)的 PREP 命令)將嵌入式 SQL 語(yǔ)句轉(zhuǎn)換為注釋。接著,它將生成宿主編譯器可處理的 DB2 運(yùn)行時(shí) API 調(diào)用。然后,預(yù)編譯器將生成相應(yīng)信息(存儲(chǔ)在程序包或綁定文件中),數(shù)據(jù)庫(kù)管理器將使用這些信息對(duì)數(shù)據(jù)庫(kù)執(zhí)行 SQL 語(yǔ)句。
預(yù)編譯器選項(xiàng) BINDFILE 創(chuàng)建一個(gè)綁定文件,用于存儲(chǔ)創(chuàng)建程序包所必要的數(shù)據(jù)。
預(yù)編譯器選項(xiàng) PACKAGE 進(jìn)行隱式綁定并且將程序包存儲(chǔ)在已連接的數(shù)據(jù)庫(kù)中。程序包是存儲(chǔ)在數(shù)據(jù)庫(kù)中的一種對(duì)象,其中包括執(zhí)行單個(gè)源文件中的特定 SQL 語(yǔ)句所需的信息,這類(lèi)信息又被稱(chēng)為存取路徑。
清單 1:帶有嵌入式靜態(tài) SQL 的 C 程序
圖 1:靜態(tài) SQL 的 DB2 預(yù)編譯和綁定步驟
動(dòng)態(tài) SQL
清單 2 展示了帶有嵌入式動(dòng)態(tài) SQL 的樣本 C 代碼。請(qǐng)注意嵌入式動(dòng)態(tài) SQL 的用法,它是通過(guò)宿主變量來(lái)容納 SQL 語(yǔ)句的 —— 例如, strcpy (qstring, "INSERT INTO name VALUES (?,?)" );
。該行代碼將 SQL 語(yǔ)句存放在 qstring 中。請(qǐng)注意,其中存放的不是數(shù)據(jù),而是獲取數(shù)據(jù)的命令。這些語(yǔ)句將由 EXEC SQL PREPARE s1 FROM :qstring;
語(yǔ)句在運(yùn)行時(shí)進(jìn)行預(yù)編譯。
注意,嵌入式動(dòng)態(tài) SQL 是包含在嵌入式靜態(tài) SQL 應(yīng)用程序之中的。 清單 2 中, EXEC SQL PREPARE s1 FROM :qstring;
和 EXEC SQL EXECUTE s1 USING :trialname, :trialvalue;
都是動(dòng)態(tài)語(yǔ)句。因此,對(duì)于代碼中的靜態(tài) SQL 片斷要采取相同的程序準(zhǔn)備步驟。但是,動(dòng)態(tài) SQL 需要增加 PREPARE
和 EXECUTE
語(yǔ)句,以便在程序運(yùn)行期間創(chuàng)建存取路徑和執(zhí)行 SQL 語(yǔ)句(見(jiàn) 圖 2)。
清單 2: 帶有嵌入式動(dòng)態(tài) SQL 的 C 程序
圖 2:動(dòng)態(tài) SQL 的 DB2 預(yù)編譯和綁定步驟
PREPARE
從字符串形式的語(yǔ)句創(chuàng)建可執(zhí)行的 SQL 語(yǔ)句。可執(zhí)行形式被稱(chēng)為已準(zhǔn)備語(yǔ)句。而字符串形式則被稱(chēng)為字符串語(yǔ)句。 EXECUTE
語(yǔ)句執(zhí)行已準(zhǔn)備的 SQL 語(yǔ)句。 EXECUTE IMMEDIATE
將字符串形式的語(yǔ)句準(zhǔn)備為可執(zhí)行形式的 SQL 語(yǔ)句,執(zhí)行該 SQL 語(yǔ)句,并且不使用宿主變量。
既然已經(jīng)理解了靜態(tài)和動(dòng)態(tài) SQL,現(xiàn)在就讓我們用 JDBC 和 SQLJ 將它們與 DB2 編程聯(lián)系起來(lái)。
JAVA 方法
Java 以支持“一次編寫(xiě),到處運(yùn)行”的程序而著名。那是如何實(shí)現(xiàn)的呢?Java 可以分兩步進(jìn)行編譯和執(zhí)行。首先,將 Java 代碼編譯成與機(jī)器無(wú)關(guān)的 字節(jié)碼(bytecode)。字節(jié)碼是用于理想化 Java 虛擬機(jī)的匯編語(yǔ)言。第二步,由運(yùn)行系統(tǒng)執(zhí)行該字節(jié)碼。運(yùn)行系統(tǒng)既可以是一個(gè)解釋器(仿真器),也可以是一個(gè)即時(shí)編譯器,它首先將字節(jié)碼編譯成本機(jī)碼,然后執(zhí)行編譯結(jié)果。該過(guò)程的兩個(gè)步驟可以在完全獨(dú)立的平臺(tái)上實(shí)現(xiàn)。
Java 程序可以從獨(dú)立的應(yīng)用程序、Web 瀏覽器中運(yùn)行的 applet 或者由 Web 應(yīng)用程序服務(wù)器(如 IBM WebSphere)運(yùn)行的 servlet 等訪問(wèn) DB2 數(shù)據(jù)庫(kù)。
Java 應(yīng)用程序在相同的位置存儲(chǔ)并執(zhí)行。Java applet 是存儲(chǔ)在 Web 服務(wù)器上并在本地 PC 瀏覽器中執(zhí)行的 Java 程序。Java servlet 是在應(yīng)用程序服務(wù)器上存儲(chǔ)并執(zhí)行而在本地瀏覽器中查看執(zhí)行結(jié)果的 Java 程序。
數(shù)字游戲:JDBC
Java 數(shù)據(jù)庫(kù)連接(JDBC)的版本號(hào)和所有與之相關(guān)的東西都是十分混亂的。首先,JDBC 有不同的版本。然后,JDBC 驅(qū)動(dòng)程序有不同的類(lèi)型,可以被不同版本的 Java 使用。每個(gè) Java 版本都有自己的別名和 Java 開(kāi)發(fā)工具箱(JDK)。
DB2 UDB 支持 JDBC 1.2、2.0 和 2.1 版(存在一些操作系統(tǒng)限制)。JDBC 版本使用不同類(lèi)型的 JDBC 驅(qū)動(dòng)程序。而 JDBC 驅(qū)動(dòng)程序?qū)⒊洚?dāng)接口,以允許將 JDBC 實(shí)現(xiàn)的通用函數(shù)和方法轉(zhuǎn)換為數(shù)據(jù)庫(kù)特定調(diào)用。JDBC Type 1 驅(qū)動(dòng)程序已經(jīng)構(gòu)建于 Java 中并且提供了 JDBC-ODBC 橋。JDBC Type 2 驅(qū)動(dòng)程序是應(yīng)用程序驅(qū)動(dòng)程序,需要通過(guò)本地 DB2 客戶(hù)機(jī)來(lái)執(zhí)行對(duì)遠(yuǎn)程數(shù)據(jù)庫(kù)的連接。JDBC Type 3 是網(wǎng)絡(luò)驅(qū)動(dòng)程序,是一個(gè)純 Java 實(shí)現(xiàn),它需要與提供 DB2 JDBC applet 服務(wù)器的中間件交流。JDBC Type 4 驅(qū)動(dòng)程序也是一個(gè)純 Java 實(shí)現(xiàn),它還帶有分布式關(guān)系型數(shù)據(jù)庫(kù)體系結(jié)構(gòu)(DRDA)應(yīng)用程序請(qǐng)求功能。使用 JDBC Type 4 驅(qū)動(dòng)程序的應(yīng)用程序不需要為連接與 DB2 客戶(hù)機(jī)交互。
無(wú)論使用哪種版本的 JDBC 都有相關(guān)的 JDK 和 Java 運(yùn)行時(shí)環(huán)境。關(guān)于該主題的更多細(xì)節(jié),請(qǐng)參閱 DB2 開(kāi)發(fā)者園地中 Paul Zikopoulos 所寫(xiě)的文章“An Overview of DB2 and Java Database Connectivity”,可在 http://www.ibm.com/developerworks/cn/dmdd/library/techarticles/0307zikopoulos/0307zikopoulos.shtml 上在線獲得。
JAVA 程序
DB2 有編寫(xiě)動(dòng)態(tài) SQL 程序的 JDBC 驅(qū)動(dòng)程序。有了 JDBC API,就不必進(jìn)行預(yù)編譯。JDBC API 是核心 Java API 標(biāo)準(zhǔn)的組成部分,也是 Java JDK 必不可少的一部分。JDBC 沒(méi)有在 Java 代碼中直接嵌入 SQL。JDBC 允許您編寫(xiě)對(duì)數(shù)據(jù)庫(kù)進(jìn)行動(dòng)態(tài) SQL 調(diào)用的 Java 程序。 它實(shí)現(xiàn)了一組方法(類(lèi)似于 ODBC),以允許將 SQL 語(yǔ)句傳遞給數(shù)據(jù)庫(kù)并且操縱結(jié)果。
JDBC 由一個(gè)高級(jí) API 和多個(gè)用于連接不同數(shù)據(jù)庫(kù)的低級(jí)驅(qū)動(dòng)程序組成。它指定 Java 接口、類(lèi)和異常,以支持連接、數(shù)據(jù)結(jié)果集處理,等等。
清單 3 展示了如何編寫(xiě)使用 JDBC 應(yīng)用程序驅(qū)動(dòng)程序訪問(wèn) DB2 數(shù)據(jù)庫(kù)的 Java 應(yīng)用程序。編寫(xiě) JDBC 應(yīng)用程序與編寫(xiě)使用 CLI 訪問(wèn)數(shù)據(jù)庫(kù)的 C 應(yīng)用程序相似。在創(chuàng)建使用 JDBC 接口的 Java 應(yīng)用程序的時(shí)候,要導(dǎo)入 java.sql 包以及根據(jù) Java 規(guī)范調(diào)用方法。
清單 3:使用 JDBC 應(yīng)用程序驅(qū)動(dòng)程序訪問(wèn) DB2 數(shù)據(jù)庫(kù)的 Java 應(yīng)用程序
清單 3 中的 Java 程序?qū)脒m當(dāng)?shù)?Java 包和類(lèi),加載適當(dāng)?shù)?JDBC 驅(qū)動(dòng)程序,連接由 JDBC 規(guī)范中所定義的 URL 指定其位置的數(shù)據(jù)庫(kù),將 SQL 語(yǔ)句傳遞給數(shù)據(jù)庫(kù),接收結(jié)果并關(guān)閉連接。
您不必預(yù)編譯或者綁定 JDBC 應(yīng)用程序。在給程序編碼之后,就像對(duì)任何其他 Java 程序一樣編譯它,要使用 JDK 中的 javac 編譯器將基于 JDBC 的 Java 程序編譯成 Java 字節(jié)碼。
JAVA SQLJ
SQLJ 是一組對(duì)核心 Java 類(lèi)的 ANSI 標(biāo)準(zhǔn)擴(kuò)展,提供了更簡(jiǎn)單的編程模型并支持創(chuàng)建靜態(tài) SQL。在編譯產(chǎn)生 Java 源代碼之前,還必須用 SQLJ 轉(zhuǎn)換器轉(zhuǎn)換 SQLJ 源文件。
DB2 有一個(gè) SQLJ 驅(qū)動(dòng)程序,用于在 Java 代碼中嵌入靜態(tài) SQL 語(yǔ)句。SQLJ API 也需要進(jìn)行類(lèi)似于預(yù)編譯(轉(zhuǎn)換)的處理。這些概念與我們?cè)谇度胧届o態(tài) SQL 和嵌入式動(dòng)態(tài) SQL 小節(jié)中所討論的十分相似。
SQLJ API 應(yīng)用程序?qū)?JDBC 用作連接數(shù)據(jù)庫(kù)和處理 SQL 錯(cuò)誤等工作的基礎(chǔ),但還可以在 SQLJ 源文件中包含嵌入式靜態(tài) SQL 語(yǔ)句。
SQLJ 中的靜態(tài) SQL 語(yǔ)句出現(xiàn)在 SQLJ 子句中。SQLJ 子句是一種機(jī)制,Java 程序中的 SQL 語(yǔ)句通過(guò)此機(jī)制與數(shù)據(jù)庫(kù)通信。SQLJ 轉(zhuǎn)換器(類(lèi)似于預(yù)編譯器)通過(guò) SQLJ 子句的結(jié)構(gòu)(以標(biāo)志 #sql 開(kāi)始并以分號(hào)結(jié)束)以將其與 SQL 語(yǔ)句相區(qū)別。嵌入式 SQL 語(yǔ)句的參數(shù)由出現(xiàn)在 SQL 語(yǔ)句中的宿主變量來(lái)傳遞,并以冒號(hào)前綴開(kāi)始。
清單 4 展示了如何編寫(xiě)使用 JDBC 應(yīng)用程序驅(qū)動(dòng)程序訪問(wèn) DB2 數(shù)據(jù)庫(kù)的 SQLJ 應(yīng)用程序。SQLJ 應(yīng)用程序?qū)脒m當(dāng)?shù)?Java 包和類(lèi),加載適當(dāng)?shù)?JDBC 驅(qū)動(dòng)程序,并使用 DB2 子協(xié)議(subprotocol)連接到由 JDBC 規(guī)范中所定義的 URL 指定其位置的數(shù)據(jù)庫(kù)。
清單 4
DB2 SQLJ 程序準(zhǔn)備需要三個(gè)步驟:
1. 運(yùn)行 SQLJ 轉(zhuǎn)換器。SQLJ 轉(zhuǎn)換器類(lèi)似于用于支持其他語(yǔ)言(如 C)中的嵌入式靜態(tài) SQL 的預(yù)處理器。它負(fù)責(zé)從源文件中提取嵌入式 SQL 命令并將之替換為對(duì) SQLJ 運(yùn)行時(shí)庫(kù)的調(diào)用。其結(jié)果就是已修改的可使用 Java 編譯器進(jìn)行編譯的 Java 源代碼程序(.java 文件),以及包含程序中 SQL 操作信息的零個(gè)或多個(gè) SQL 配置文件。
2. 使用 javac 命令編譯由轉(zhuǎn)換器輸出的已修改的 Java 源代碼。這將產(chǎn)生包含 Java 字節(jié)碼的一個(gè)或多個(gè) .class 文件。
3. 為 DB2 定制 SQLJ 配置文件。配置文件是與供應(yīng)商無(wú)關(guān)的,因此,必須定制它們。默認(rèn)情況下,SQLJ 配置文件將 .ser 作為擴(kuò)展名。定制過(guò)程將通用的 SQLJ 配置文件轉(zhuǎn)換為 DB2 特定的綁定文件,可通過(guò)將綁定文件綁定到程序包來(lái)將DB2 特定的綁定文件綁定到 DB2。
達(dá)到熟練
如果您正計(jì)劃將應(yīng)用程序從其他數(shù)據(jù)庫(kù)環(huán)境遷移到 DB2,就需要掌握一些特定于 DB2 的概念。本文只是作為一個(gè)簡(jiǎn)介。我提及的那些出版物提供了更加完整的教學(xué)。如果您已經(jīng)是一個(gè)熟練的開(kāi)發(fā)者,那么將發(fā)現(xiàn)到 DB2 的轉(zhuǎn)換是十分平坦的。
關(guān)于作者
 |
|
 |
Debra Eaton 是 IBM 的 Software Migration Project Office 團(tuán)隊(duì)的軟件信息技術(shù)專(zhuān)家。可通過(guò) deaton@us.ibm.com與她聯(lián)系。
|
http://www.ibm.com/developerworks/cn/data/library/techarticles/mag_02q2eaton/eaton.html