日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

完全版 ESQL/C資料二( 六 )


第一步、預編譯
源程序生成以后,在源程序中嵌入了許多SQL語句,而SQL語句是宿主語言編譯器所不認識的,所以在用宿主語言編譯器進行編譯、連接之前必須將SQL語句分離出來,這就是預編譯所做的工作 。DB2中預編譯操作是通過PREP命令執(zhí)行的,PREP命令首先將源程序中的所有有關(guān)SQL語句全部注釋起來,對它進行分析和語法檢查 。如果源程序中的SQL語句全部書寫正確,則將這些SQL語句轉(zhuǎn)換成C語言可以識別的一系列的API函數(shù) 。這些函數(shù)可以在函數(shù)執(zhí)行時訪問數(shù)據(jù)庫,然后將源文件中所有用于生成數(shù)據(jù)庫管理器的PACKAGE的數(shù)據(jù)提出組合成一個BIND文件 。也可以直接生成一個PACKAGE,但這相當于在預編譯后又執(zhí)行了一次BIND操作 。在預編譯時,對整個源程序文件中的所有變量做統(tǒng)一處理而不根據(jù)變量的生命期來處理,所以宿宿主變量在整個程序中是唯一的 。下面講解預編譯的步驟:
1)、連接到一個數(shù)據(jù)庫,該操作是為BIND做準備 。操作如下:
db2 connect to cicstest
2)、執(zhí)行預編譯命令,假設(shè)源文件為adhoc.sqc,則:
db2 prep adhoc.sqc bindfile
下面我們對預編譯的幾種輸出文件進行討論 。
l預編譯后生成的C語言源文件:該文件中原有的SQL語句,已經(jīng)全部加上注釋并轉(zhuǎn)換成了C語言可以識別的API調(diào)用 。
lBIND文件:如果在預編譯時使用BINDFILE選項,則生成BIND文件,BIND文件的后綴為.bnd,BIND文件可以在將來使用BIND命令來生成PACKAGE 。
db2 bind adhoc.bnd
如果在預編譯時,只生成BIND文件,那么即使在預編譯時,不能訪問某些數(shù)據(jù)庫對象,系統(tǒng)也只是報警,而不會報錯 。如果使用PACKAGE選項,則生成PACKAGE 。如果有MESSAGE選項,則生成信息文件,它包含了所有的返回信息,如:警報、錯誤等 。它便于程序員對源程序做進一步的修改 。
第二步、編譯和連接
在預編譯后,程序中只有C語言語句,它們都可以為C語言的編譯器所識別 。所以,可以按照一般的方法進行編譯和連接,但在將SQL語句轉(zhuǎn)換以后,在C語言程序中,又引入了許多一般的C語言系統(tǒng)所沒有的INCLUDE文件和函數(shù)庫,這些均在DB2的SDK中 。所以,要生成可執(zhí)行的程序,就必須安裝DB2的SDK,并且做以下設(shè)置:
set INCLUDE=$(DB2PATH)include;%include%
set LIB=$(DB2PATH)lib;%LIB%
下面是編譯和連接:
cl -o adhoc.exe adhoc.c
生成的可執(zhí)行文件必須與數(shù)據(jù)庫管理器中的PACKAGE相結(jié)合,才能執(zhí)行 。
下面對BIND做進一步解釋 。
PACKAGE是DB2為SQL語句制定的訪問計劃 。通過precompile之后,源程序中的SQL語句部分就被分離出來 。PACKAGE就是根據(jù)具體的SQL語句和數(shù)據(jù)庫中的信息生成的針對每條SQL語句的訪問計劃,它存放在DB2數(shù)據(jù)庫服務(wù)器上 。應(yīng)用程序執(zhí)行到SQL語句時,就到相應(yīng)的服務(wù)器上去找它們的PACKAGE,數(shù)據(jù)庫服務(wù)器根據(jù)PACKAGE執(zhí)行具體的數(shù)據(jù)庫操作 。所以,如果一個應(yīng)用程序訪問了多個數(shù)據(jù)庫服務(wù)器,則該應(yīng)用程序應(yīng)在它訪問到的數(shù)據(jù)庫服務(wù)器上均生成相應(yīng)的PACKAGE 。因此,當遇到這種情況時,推薦的方式是將源程序分成若干個文件,每個文件只訪問一個服務(wù)器,然后分別進行預編譯 。
執(zhí)行PREP命令時,加上選項PACKAGE或不注明BINDFILE、SYNTAX或SQLFLAG選項,這時BIND操作將自動進行 。
直接使用BIND命令從BIND文件中生成PACKAGE存放在數(shù)據(jù)庫管理器中 。BIND完成的功能是,從數(shù)據(jù)庫中找到SQL語句所涉及的表,查看SQL語句中提到的表名及屬性是否與數(shù)據(jù)庫中的表名和屬性相匹配,以及應(yīng)用程序開發(fā)者是否有權(quán)限查詢或修改應(yīng)用程序中所涉及到的表及屬性 。這就是為什么在預編譯之前要連接到相應(yīng)的數(shù)據(jù)庫上的原因 。在做BIND操作后,在數(shù)據(jù)庫管理器中就生成一個PACKAGE,PACKAGE的名字與源程序的文件名字相同 。

推薦閱讀