ECPG 接口

ECPG是瀚高数据库的嵌入式 SQL 包,最初它是为了与 C 一起工作而编写的。它也能与 C++配合,但是它还不识别所有的 C++结构。

一个嵌入式 SQL 程序由一种普通编程语言编写的代码(在这里是 C)和位于特殊标记的小节中的 SQL 命令混合组成。

要构建该程序,源代码(.pgc)首先会通过嵌入式 SQL预处理器,它会将源代码转换成一个普通 C 程序(.c),并且后来它能够被一个 C 编译器所处理。转换过的 ECPG 应用会通过嵌入式 SQL 库(ecpglib)调用 libpq 库中的函数,并且与瀚高数据库服务器使用普通的前端/后端协议通信。

嵌入式 SQL 在为 C 代码处理 SQL 命令方面比起其他方法来具有优势。

首先,它会搞定向你的 C 程序变量传递或者读取信息时的繁文缛节。

其次,程序中的 SQL 代码在编译时就会被检查以保证语法正确性。

第三,C 中的嵌入式 SQL 是在 SQL 标准中指定的并且受到很多其他 SQL 数据库系统的支持。瀚高数据库实现被设计为尽可能匹配这个标准,并且通常可以相对容易地把为其他 SQL 数据库编写的 SQL 程序移植到瀚高数据库。

ECPG-C的嵌套SQL编程一般要经过以下几个流程:

  • 编写C语言有SQL混合的源代码文件(*.pgc)*

    SQL语句形式:EXEC SQL … 这些语句在语法上取代了一个 C 语句。它们可以出现在全局层面或者是一个函数中。嵌入式 SQL 语句遵循普通 SQL 代码的大小写敏感性规则, 而不是 C的大小写敏感性规则。它们也允许嵌套的 C 风格注释(SQL 标准的一部分)。 不过,程序的 C 部分遵循 C 的标准不接受嵌套注释

  • 使用ecpg预处理工具将*.pgc转化为*.c文件

  • 编译/链接*.c文件生成可执行文件

常用函数

函数名称 功能说明
EXEC SQL CONNECT TO 创建一个数据库连接
EXEC SQL DISCONNECT 关闭一个连接
EXEC SQL CREATE 创建语句
EXEC SQL INSERT INTO 插入语句
XEC SQL DELETE 删除语句
EXEC SQL UPDATE 修改语句
EXEC SQL COMMIT 提交
EXEC SQL PREPARE 创建一个预备语句

具体的函数用法,请参考《瀚高数据库开发手册》

开发环境搭建

软件 版本
HGDB 安全版V4、企业版v5及以上版本
gcc 4.8.5

编写.pgc文件

利用编辑器生成.pgc文件,内容如下:

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;
}

使用预处理工具编译成.c文件

嵌入式 SQL程序通常带有扩展名.pgc。可以调用下面的命令对它进行预处理:

ecpg prog.pgc

该预处理工具 ecpg 瀚高数据库会默认安装,并作为客户端命令存在。

ecpg [option…] file..

ecpg 是用于 C 程序的嵌入式 SQL 预处理器。它通过将 SQL 调用替换为特殊函数调用把带有嵌入式 SQL 语句的 C 程序转换为普通 C 代码。输出文件可以被任何C 编译器工具链处理。

ecpg 将把命令行中给出的每一个输入文件转换为相应的 C 输出文件。 输入文件更适宜于使用扩展名.pgc。该扩展名将被替换为.c 来决定输出文件名。 输出文件名也可以使用-o 选项覆盖。

可以用 ecpg –help 命令查看具体用法。

image-20220429202151490

执行完成后,会生成.c文件。

image-20220429204511298

编译源文件

前提:GCC编译器是必需要的,GCC仅仅是一个编译器,没有界面,必须在命令行模式下使用

gcc -I /opt/HighGo4.5.7-see/include -c prog.c

编译产生的.c 源文件,通过指定一个 选 项 ( 例 如 -I/opt/HighGo4.5.7-see/include)加载编译时需要的头文件。

执行完成后,会生成.o目标文件

image-20220429203528299

链接生成可执行文件

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

编译时加上-lecpg

通过 -L 选项向 GCC 的库文件搜索路径中添加新的目录,该目录下有链接时所需要的库文件 。

执行完成后,会生成执行文件

image-20220429210009088

执行可执行文件

./prog

image-20220429210045915

执行结果:

image-20220429210301326

【小贴士】

ECPG的具体用法,参见ECPG技术文档

  • 编译处理的 C 代码文件时,编译器需要能够在 HGDB 目录中找到 ECPG 头文件。因此,在调用编译器时必须使用-I选项

例如 -I/usr/local/pgsql/include

  • 使用带有嵌入式 SQL 的 C 代码的程序必须针对libecpg库进行链接

例如,使用链接器选项-L/usr/local/pgsql/lib -lecpg