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> |
使用预处理工具编译成.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 命令查看具体用法。
执行完成后,会生成.c文件。
编译源文件
前提:GCC编译器是必需要的,GCC仅仅是一个编译器,没有界面,必须在命令行模式下使用
gcc -I /opt/HighGo4.5.7-see/include -c prog.c |
编译产生的.c 源文件,通过指定一个 选 项 ( 例 如 -I/opt/HighGo4.5.7-see/include)加载编译时需要的头文件。
执行完成后,会生成.o目标文件
链接生成可执行文件
gcc -o prog prog.o -L /opt/HighGo4.5.7-see/lib -lecpg |
编译时加上-lecpg
通过 -L 选项向 GCC 的库文件搜索路径中添加新的目录,该目录下有链接时所需要的库文件 。
执行完成后,会生成执行文件
执行可执行文件
./prog |
执行结果:
【小贴士】
ECPG的具体用法,参见ECPG技术文档
- 编译处理的 C 代码文件时,编译器需要能够在 HGDB 目录中找到 ECPG 头文件。因此,在调用编译器时必须使用
-I
选项
例如 -I/usr/local/pgsql/include
。
- 使用带有嵌入式 SQL 的 C 代码的程序必须针对
libecpg
库进行链接
例如,使用链接器选项-L/usr/local/pgsql/lib -lecpg
。