文档中心MogDBMogDB StackUqbar
v5.0

文档:v5.0

支持的版本:

其他版本:

支持嵌入式SQL预处理器(ECPG)

可获得性

本特性自MogDB 5.0.0版本开始引入。

特性简介

支持C语言中嵌入式SQL程序。

客户价值

可以相对容易地将为其他SQL数据库编写的嵌入式SQL程序移植到MogDB,保证用户业务快速迁移。

特性描述

嵌入式SQL程序由一种普通编程语言编写的代码(在这里是C)和位于特殊标记的小节中的SQL命令混合组成。要构建该程序,源代码(.pgc)首先会通过嵌入式SQL预处理器,它会将源代码转换成一个普通C程序(.c),并且后来它能够被一个C编译器所处理。转换过的 ECPG 应用会通过嵌入式 SQL 库(ecpglib)调用libpq库中的函数,并且与MogDB服务器使用普通的前端/后端协议通信。 嵌入式SQL在为 C 代码处理SQL命令方面比起其他方法来具有优势。

  1. 它处理了C程序中变量之间冗长的信息传递;
  2. 其次,程序中的SQL代码在编译时就会被检查以保证语法正确性;
  3. 在C语言中嵌入的SQL是在SQL标准中指定的并且受到很多其他SQL数据库系统的支持。

特性增强

无。

特性约束

ECPG支持大部分的MogDB SQL语法,但由于目前ECPG的语法和词法不支持对匿名块和Package语句的处理,因此匿名块和创建Package语句无法作为嵌入式SQL使用。

依赖关系

无。

使用方法

ECPG编译使用如下命令:

  1. ecpg testecpg.ecpg -o testecpg.c

  2. gcc -l$GAUSSHOME/include/postgresql/server/ -l$GAUSSHOME/include -L$GAUSSHOME/lib -lpq -lecpg -o testecpg testecpg.c

示例

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

/* error handlers for the whole program */
EXEC SQL WHENEVER NOT FOUND DO BREAK;


int main(int argc, char **argv)
{
    EXEC SQL BEGIN DECLARE SECTION;
    int v_id, v_name_ind;
    char v_name[32];
    char *url="tcp:postgresql://127.0.0.1:5432/postgres";
    char *username="ecpg";
    char *password="Test@123";
    EXEC SQL END DECLARE SECTION;

    EXEC SQL DECLARE c CURSOR FOR
        SELECT id, name
        FROM test_ecpg_tab
        ORDER BY 1;

    /* connect to the database */
    EXEC SQL CONNECT TO :url USER :username USING :password;

    /* open a cursor */
    EXEC SQL OPEN c;

    /* loop will be left if the cursor is done */
    for(;;)
    {
        /* get the next result row */
        EXEC SQL FETCH NEXT FROM c INTO :v_id, :v_name :v_name_ind;

        printf(
            "id = %d, name = %s\n",
            v_id,
            v_name_ind ? "(null)" : v_name
        );
    }

    EXEC SQL CLOSE c;
    EXEC SQL COMMIT;
    EXEC SQL DISCONNECT;

    return 0;
}
  1. 创建数据库用户

    create user ecpg identified by 'Test@123';
  2. 创建测试表

    drop table if exists ecpg.test_ecpg_tab;
    create table ecpg.test_ecpg_tab as select id , ' name '||id name from generate_series(1,20) id;
Copyright © 2011-2024 www.enmotech.com All rights reserved.