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>
#include <stdlib.h>
#include <libpq-fe.h>
#include <libpq/libpq-fs.h>

int main(void)
{
EXEC SQL CONNECT TO highgo@192.168.2.5:5866 AS conn1 USER test USING "test";

if(sqlca.sqlcode<0){
perror("connect err");
printf("\d\n",sqlca.sqlcode);
return -1;
}

EXEC SQL create table test(id int, name varchar);
EXEC SQL COMMIT;

EXEC SQL insert into test values(1, 'aaa');
EXEC SQL COMMIT;

EXEC SQL DISCONNECT conn1;

return 0;
}

使用預(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 命令查看具體用法。

image-20220429202151490

執(zhí)行完成后,會生成.c文件。

image-20220429204511298

編譯源文件

前提: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)文件

image-20220429203528299

鏈接生成可執(zhí)行文件

gcc -o prog prog.o -L /opt/HighGo4.5.7-see/lib -lecpg

編譯時加上-lecpg

通過 -L 選項向 GCC 的庫文件搜索路徑中添加新的目錄,該目錄下有鏈接時所需要的庫文件 。

執(zhí)行完成后,會生成執(zhí)行文件

image-20220429210009088

執(zhí)行可執(zhí)行文件

./prog

image-20220429210045915

執(zhí)行結(jié)果:

image-20220429210301326

【小貼士】

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。