ECPG 接口
ECPG是瀚高數(shù)據(jù)庫的嵌入式 SQL 包,最初它是為了與 C 一起工作而編寫的。它也能與 C++配合,但是它還不識別所有的 C++結(jié)構(gòu)。
一個嵌入式 SQL 程序由一種普通編程語言編寫的代碼(在這里是 C)和位于特殊標(biāo)記的小節(jié)中的 SQL 命令混合組成。
要構(gòu)建該程序,源代碼(.pgc)首先會通過嵌入式 SQL預(yù)處理器,它會將源代碼轉(zhuǎn)換成一個普通 C 程序(.c),并且后來它能夠被一個 C 編譯器所處理。轉(zhuǎn)換過的 ECPG 應(yīng)用會通過嵌入式 SQL 庫(ecpglib)調(diào)用 libpq 庫中的函數(shù),并且與瀚高數(shù)據(jù)庫服務(wù)器使用普通的前端/后端協(xié)議通信。
嵌入式 SQL 在為 C 代碼處理 SQL 命令方面比起其他方法來具有優(yōu)勢。
首先,它會搞定向你的 C 程序變量傳遞或者讀取信息時的繁文縟節(jié)。
其次,程序中的 SQL 代碼在編譯時就會被檢查以保證語法正確性。
第三,C 中的嵌入式 SQL 是在 SQL 標(biāo)準(zhǔn)中指定的并且受到很多其他 SQL 數(shù)據(jù)庫系統(tǒng)的支持。瀚高數(shù)據(jù)庫實現(xiàn)被設(shè)計為盡可能匹配這個標(biāo)準(zhǔn),并且通??梢韵鄬θ菀椎匕褳槠渌?SQL 數(shù)據(jù)庫編寫的 SQL 程序移植到瀚高數(shù)據(jù)庫。
ECPG-C的嵌套SQL編程一般要經(jīng)過以下幾個流程:
編寫C語言有SQL混合的源代碼文件(*.pgc)*
SQL語句形式:EXEC SQL … 這些語句在語法上取代了一個 C 語句。它們可以出現(xiàn)在全局層面或者是一個函數(shù)中。嵌入式 SQL 語句遵循普通 SQL 代碼的大小寫敏感性規(guī)則, 而不是 C的大小寫敏感性規(guī)則。它們也允許嵌套的 C 風(fēng)格注釋(SQL 標(biāo)準(zhǔn)的一部分)。 不過,程序的 C 部分遵循 C 的標(biāo)準(zhǔn)不接受嵌套注釋
使用ecpg預(yù)處理工具將*.pgc轉(zhuǎn)化為*.c文件
編譯/鏈接*.c文件生成可執(zhí)行文件
常用函數(shù)
函數(shù)名稱 | 功能說明 |
---|---|
EXEC SQL CONNECT TO | 創(chuàng)建一個數(shù)據(jù)庫連接 |
EXEC SQL DISCONNECT | 關(guān)閉一個連接 |
EXEC SQL CREATE | 創(chuàng)建語句 |
EXEC SQL INSERT INTO | 插入語句 |
XEC SQL DELETE | 刪除語句 |
EXEC SQL UPDATE | 修改語句 |
EXEC SQL COMMIT | 提交 |
EXEC SQL PREPARE | 創(chuàng)建一個預(yù)備語句 |
具體的函數(shù)用法,請參考《瀚高數(shù)據(jù)庫開發(fā)手冊》
開發(fā)環(huán)境搭建
軟件 | 版本 |
---|---|
HGDB | 安全版V4、企業(yè)版v5及以上版本 |
gcc | 4.8.5 |
編寫.pgc文件
利用編輯器生成.pgc文件,內(nèi)容如下:
proc.pgc
#include <stdio.h> |
使用預(yù)處理工具編譯成.c文件
嵌入式 SQL程序通常帶有擴展名.pgc??梢哉{(diào)用下面的命令對它進(jìn)行預(yù)處理:
ecpg prog.pgc |
該預(yù)處理工具 ecpg 瀚高數(shù)據(jù)庫會默認(rèn)安裝,并作為客戶端命令存在。
ecpg [option…] file..
ecpg 是用于 C 程序的嵌入式 SQL 預(yù)處理器。它通過將 SQL 調(diào)用替換為特殊函數(shù)調(diào)用把帶有嵌入式 SQL 語句的 C 程序轉(zhuǎn)換為普通 C 代碼。輸出文件可以被任何C 編譯器工具鏈處理。
ecpg 將把命令行中給出的每一個輸入文件轉(zhuǎn)換為相應(yīng)的 C 輸出文件。 輸入文件更適宜于使用擴展名.pgc。該擴展名將被替換為.c 來決定輸出文件名。 輸出文件名也可以使用-o 選項覆蓋。
可以用 ecpg –help 命令查看具體用法。
執(zhí)行完成后,會生成.c文件。
編譯源文件
前提:GCC編譯器是必需要的,GCC僅僅是一個編譯器,沒有界面,必須在命令行模式下使用
gcc -I /opt/HighGo4.5.7-see/include -c prog.c |
編譯產(chǎn)生的.c 源文件,通過指定一個 選 項 ( 例 如 -I/opt/HighGo4.5.7-see/include)加載編譯時需要的頭文件。
執(zhí)行完成后,會生成.o目標(biāo)文件
鏈接生成可執(zhí)行文件
gcc -o prog prog.o -L /opt/HighGo4.5.7-see/lib -lecpg |
編譯時加上-lecpg
通過 -L 選項向 GCC 的庫文件搜索路徑中添加新的目錄,該目錄下有鏈接時所需要的庫文件 。
執(zhí)行完成后,會生成執(zhí)行文件
執(zhí)行可執(zhí)行文件
./prog |
執(zhí)行結(jié)果:
【小貼士】
ECPG的具體用法,參見ECPG技術(shù)文檔
- 編譯處理的 C 代碼文件時,編譯器需要能夠在 HGDB 目錄中找到 ECPG 頭文件。因此,在調(diào)用編譯器時必須使用
-I
選項
例如 -I/usr/local/pgsql/include
。
- 使用帶有嵌入式 SQL 的 C 代碼的程序必須針對
libecpg
庫進(jìn)行鏈接
例如,使用鏈接器選項-L/usr/local/pgsql/lib -lecpg
。