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