• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            嵌入式靜態(tài)、動(dòng)態(tài)SQL

            Posted on 2009-08-03 15:16 Prayer 閱讀(1006) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): DB2
            您是 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)用。





            回頁(yè)首


            靜態(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ù)編譯和綁定步驟





            回頁(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 需要增加 PREPAREEXECUTE 語(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)。





            回頁(yè)首


            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 程序。





            回頁(yè)首


            數(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 上在線獲得。





            回頁(yè)首


            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é)碼。





            回頁(yè)首


            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。

            參考資料

            IBM Software Migration Project Office
            ibm.com/solutions/ softwaremigration

            DB2 UDB Programming Fastpath Course(免費(fèi))
            ibm.com/software/ data/db2/ct10crs





            回頁(yè)首


            達(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
            青青青青久久精品国产h久久精品五福影院1421 | 囯产极品美女高潮无套久久久| 亚洲国产二区三区久久| 久久久精品国产亚洲成人满18免费网站 | 国产精品无码久久久久| 日韩久久无码免费毛片软件| 99久久国产宗和精品1上映| 国产精品久久久久久福利69堂| 久久综合九色综合97_久久久| 久久一区二区三区99| 亚洲AV乱码久久精品蜜桃| 色噜噜狠狠先锋影音久久| 久久久久久国产精品美女| 好属妞这里只有精品久久| 亚洲精品无码久久久久AV麻豆| 亚洲人成网亚洲欧洲无码久久| 久久综合久久久| 亚洲精品乱码久久久久久蜜桃图片| 777久久精品一区二区三区无码| 久久无码中文字幕东京热| 国产午夜精品理论片久久 | 97久久超碰国产精品旧版| 久久久久噜噜噜亚洲熟女综合 | 久久伊人五月丁香狠狠色| 青青草国产成人久久91网| 99精品久久精品一区二区| 久久精品国产亚洲AV不卡| 精品久久久久久久久中文字幕| 漂亮人妻被黑人久久精品| 亚洲人成无码久久电影网站| 精品久久人人妻人人做精品| 精品久久久久久久久中文字幕| 欧美va久久久噜噜噜久久| 无码人妻久久久一区二区三区| 久久毛片一区二区| 国产精品久久新婚兰兰| 日韩欧美亚洲综合久久影院Ds | 亚洲国产精品无码久久一线| 久久久久av无码免费网| 伊人久久无码精品中文字幕| 久久久久亚洲爆乳少妇无|