VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

ECPG适配Vastbase

  1. 功能描述

ECPG工具用于处理C中的嵌入式SQL语句,将包含嵌入式SQL语句的C程序转换成可以被C/C++编译器编译执行的C/C++程序。

  1. 功能说明

1、Vastbase SQL命令

除部分SQL命令不支持外其余Vastbase SQL命令全部支持,具体SQL语句见《Vastbase管理员手册》和 openGauss2.2.0版本的《openGauss开发者指南》。以下为不支持的SQL命令:

(1)匿名块相关,包括开启匿名块和创建包含匿名块的函数。

开启匿名块: [DECLARE[declare_statements]] BEGIN execution_statements END;

(2)create package xxx

不支持创建package

因此,匿名块和创建Package语句无法作为嵌入式SQL使用。除以上SQL语句之外Vastbase支持的所有SQL语句都可以作为嵌入式SQL语句使用。

2、ECPG SQL命令

ECPG SQL语法列表如下:

  1. ALLOCATE DESCRIPTOR —— 分配一个SQL描述符区域

  2. CONNECT —— 建立一个数据库连接

  3. DEALLOCATE DESCRIPTOR —— 释放一个SQL描述符区域

  4. DECLARE —— 定义一个游标

  5. DESCRIBE —— 得到有关一个预备语句或结果集的信息

  6. DISCONNECT —— 终止一个数据库连接

  7. EXECUTE IMMEDIATE —— 动态地准备和执行一个语句

  8. GET DESCRIPTOR —— 从一个SQL描述符区域得到信息

  9. OPEN —— 打开一个动态游标

  10. PREPARE —— 准备一个语句用于执行

  11. SET AUTOCOMMIT —— 设置当前会话的自动提交行为

  12. SET CONNECTION —— 选择一个数据库连接

  13. SET DESCRIPTOR —— 在一个SQL描述符区域中设置信息

  14. TYPE —— 定义一种新数据类型

  15. VAR —— 定义一个变量

  16. WHENEVER —— 指定一个要在一个SQL语句导致发生一个特定类别的情况时要采取的动作

注意,在Vastbase 中,ECPG SQL中的CALL和 IDENTIFIED改名为ECPGCALL和ECPGIDENTIFIED。

3、在C语言中使用嵌入式SQL语句的语法如下:

EXEC SQL stmt; 

stmt为一条SQL语句。

  1. 使用流程

1、已安装ECPG工具及其依赖包

2、编写一个C程序,后缀为.pgc,在文件中使用嵌入式SQL语句,例如在prog1.pgc文件中使用SQL命令:

EXEC SQL CREATE TABLE t1(id int,info text);   --定义表t1

3、使用ECPG工具将pgc文件,例如prog1.pgc文件编译为prog1.c:

ecpg prog1.pgc

4、编译可执行程序,例如:

cc -I /usr/local/pgsql/include -c prog1.c
cc -o prog1 prog1.o -L /usr/local/pgsql/lib -lecpg

5、运行可执行程序:

./prog1
  1. 示例

如下示例中在C程序中通过嵌入式SQL实现数据库连接、创建表、插入、修改、查询、连接断开。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
EXEC SQL BEGIN DECLARE SECTION;
int i1[3],i2[3],i3[3],i4;
EXEC SQL END DECLARE SECTION;

ECPGdebug(1,stderr);
EXEC SQL CONNECT TO vastbase;

EXEC SQL WHENEVER SQLWARNING SQLPRINT;
EXEC SQL WHENEVER SQLERROR SQLPRINT;

EXEC SQL CREATE TABLE insupd_test(a int, b int);

EXEC SQL INSERT INTO insupd_test (a,b) values (1,1);
EXEC SQL INSERT INTO insupd_test (a,b) values (2,2);
EXEC SQL INSERT INTO insupd_test (a,b) values (3,3) retuming a into :i4;

EXEC SQL UPDATE insupd_test set a=a+1 returning a into :i3;
EXEC SQL UPDATE insupd_test set (a,b)=(5,5) where a= 4;
EXEC SQL UPDATE insupd_test set a=4 where a=3;

EXEC SQL SELECT a,b into :i1,:i2 from insupd_test order by a;

printf("changes\n%d %d %d %d\n",i3[0],i3[1],i3[2],i4);
printf("test\na b\n%d %d\n%d %d\n%d %d\n",i1[0],i2[0],i1[1],i2[1],i1[2],i2[2]);

EXEC SQL DISCONNECT ALL;

return 0;
}