PostgreSQL ECPG 开发 DEMO

ECPG 是在C中嵌套SQL的一种用法。
写好pgc文件后,需要使用ecpg程序将pgc编程成C文件来使用。

详细的用法请参考
https://www.postgresql.org/docs/9.5/static/ecpg.html

ecpg的用法, 以EXEC SQL开头表示后面是SQL写法

一些简单的用法
大小写敏感.
.1. 连接数据库

EXEC SQL CONNECT TO target [AS connection-name] [USER user-name];

target :
dbname[@hostname][:port]
tcp:postgresql://hostname[:port][/dbname][?options]
unix:postgresql://hostname[:port][/dbname][?options]

例子
EXEC SQL CONNECT TO mydb@sql.mydomain.com;

EXEC SQL CONNECT TO unix:postgresql://sql.mydomain.com/mydb AS myconnection USER john;

EXEC SQL BEGIN DECLARE SECTION;
const char *target = "mydb@sql.mydomain.com";
const char *user = "john";
const char *passwd = "secret";
EXEC SQL END DECLARE SECTION;
 ...
EXEC SQL CONNECT TO :target USER :user USING :passwd;
/* or EXEC SQL CONNECT TO :target USER :user/:passwd; */

.2. 定义ecpg变量
PostgreSQL数据类型与ecpg使用的类型的映射关系
https://www.postgresql.org/docs/9.5/static/ecpg-variables.html#ECPG-VARIABLES-TYPE-MAPPING
有些类型没有一一对应的关系,需要使用ecpg的函数来转换。

下面是一个DEMO
首先需要编写pgc文件。

$ vi t.pgc
#include <stdio.h>
#include <stdlib.h>
#include <pgtypes_numeric.h>

EXEC SQL WHENEVER SQLERROR STOP;

int
main(void)
{
EXEC SQL BEGIN DECLARE SECTION;
    numeric *num;
    numeric *num2;
    decimal *dec;
EXEC SQL END DECLARE SECTION;

    EXEC SQL CONNECT TO tcp:postgresql://xxxcs.com:3433/postgres AS db_digoal USER digoal USING digoal;

    num = PGTYPESnumeric_new();
    dec = PGTYPESdecimal_new();

    EXEC SQL SELECT 12.345::numeric(4,2), 23.456::decimal(4,2) INTO :num, :dec;

    printf("numeric = %s\n", PGTYPESnumeric_to_asc(num, 0));
    printf("numeric = %s\n", PGTYPESnumeric_to_asc(num, 1));
    printf("numeric = %s\n", PGTYPESnumeric_to_asc(num, 2));

    /* Convert decimal to numeric to show a decimal value. */
    num2 = PGTYPESnumeric_new();
    PGTYPESnumeric_from_decimal(dec, num2);

    printf("decimal = %s\n", PGTYPESnumeric_to_asc(num2, 0));
    printf("decimal = %s\n", PGTYPESnumeric_to_asc(num2, 1));
    printf("decimal = %s\n", PGTYPESnumeric_to_asc(num2, 2));

    PGTYPESnumeric_free(num2);
    PGTYPESdecimal_free(dec);
    PGTYPESnumeric_free(num);

    EXEC SQL COMMIT;
    EXEC SQL DISCONNECT ALL;
    return 0;
}

本地环境中需要有依赖的头文件和库.
编译.pgc
-t 表示使用自动提交

ecpg -t -c -I/home/digoal/pgsql9.6/include -o t.c t.pgc

查看编译后的.c

/* Processed by ecpg (4.12.0) */
/* These include files are added by the preprocessor */
#include <ecpglib.h>
#include <ecpgerrno.h>
#include <sqlca.h>
/* End of automatic include section */

#line 1 "t.pgc"
#include <stdio.h>
#include <stdlib.h>
#include <pgtypes_numeric.h>

/* exec sql whenever sqlerror  stop ; */
#line 5 "t.pgc"

int
main(void)
{
/* exec sql begin declare section */

#line 11 "t.pgc"
 numeric * num ;

#line 12 "t.pgc"
 numeric * num2 ;

#line 13 "t.pgc"
 decimal * dec ;
/* exec sql end declare section */
#line 14 "t.pgc"

    { ECPGconnect(__LINE__, 0, "tcp:postgresql://rdsqm2ffv0wjxnxk5nbsi.pg.rds.aliyuncs.com:3433/postgres" , "digoal" , "digoal" , "db_digoal", 1);
#line 16 "t.pgc"

if (sqlca.sqlcode < 0) exit (1);}
#line 16 "t.pgc"

    num = PGTYPESnumeric_new();
    dec = PGTYPESdecimal_new();

    { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select 12.345 :: numeric ( 4 , 2 ) , 23.456 :: decimal ( 4 , 2 )", ECPGt_EOIT,
        ECPGt_numeric,&(num),(long)1,(long)0,sizeof(numeric),
        ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
        ECPGt_decimal,&(dec),(long)1,(long)0,sizeof(decimal),
        ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 21 "t.pgc"

if (sqlca.sqlcode < 0) exit (1);}
#line 21 "t.pgc"

    printf("numeric = %s\n", PGTYPESnumeric_to_asc(num, 0));
    printf("numeric = %s\n", PGTYPESnumeric_to_asc(num, 1));
    printf("numeric = %s\n", PGTYPESnumeric_to_asc(num, 2));

    /* Convert decimal to numeric to show a decimal value. */
    num2 = PGTYPESnumeric_new();
    PGTYPESnumeric_from_decimal(dec, num2);

    printf("decimal = %s\n", PGTYPESnumeric_to_asc(num2, 0));
    printf("decimal = %s\n", PGTYPESnumeric_to_asc(num2, 1));
    printf("decimal = %s\n", PGTYPESnumeric_to_asc(num2, 2));

    PGTYPESnumeric_free(num2);
    PGTYPESdecimal_free(dec);
    PGTYPESnumeric_free(num);

    { ECPGtrans(__LINE__, NULL, "commit");
#line 39 "t.pgc"

if (sqlca.sqlcode < 0) exit (1);}
#line 39 "t.pgc"

    { ECPGdisconnect(__LINE__, "ALL");
#line 40 "t.pgc"

if (sqlca.sqlcode < 0) exit (1);}
#line 40 "t.pgc"

    return 0;
}

编译,链接 .c

gcc -I/home/digoal/pgsql9.6/include  -Wall -g  t.c  -L/home/digoal/pgsql9.6/lib -lecpg -lpq -lpgtypes -o t

也可以写成Makefile如下 :
$ vi Makefile
注意需要TAB键.

ECPG = ecpg
CC = gcc

INCLUDES = -I$(shell pg_config --includedir)
LIBPATH = -L$(shell pg_config --libdir)
CFLAGS += $(INCLUDES)
LDFLAGS += -Wall -g
LDLIBS += $(LIBPATH) -lecpg -lpq -lpgtypes

%.c: %.pgc
        $(ECPG) -t -c $(INCLUDES) -o $@ $<

%: %.o
        $(CC) $(CFLAGS) $(LDFLAGS) $(LDLIBS) -o $@ $<

TESTS = t t.c

default: $(TESTS)

clean:
        rm -f *.o *.so t t.c

使用时注意把pg_config弄进PATH

$ export PATH=/home/digoal/pgsql9.6/bin:$PATH
$ make

使用编译好的t :

./t
numeric = 12
numeric = 12.4
numeric = 12.35
decimal = 23
decimal = 23.5
decimal = 23.46
时间: 2024-08-11 09:02:13

PostgreSQL ECPG 开发 DEMO的相关文章

实战 Eclipse ,Jigloo, PostgreSQL,JDBC 开发数据库查询应用系统起步

数据|数据库 实战 Eclipse ,Jigloo, PostgreSQL,JDBC 开发数据库查询应用系统起步 1 安装 Eclipse笔者用的GNU/Linux先从 下载了些GTK+相关的包编译安装之后,到Eclipse主页上 找到了Linux下GTK的 Eclipse安装文件 2 .插件笔者安装了两个插件一个是GUI设计工具 jigloo,主页:http://cloudgarden.com/jigloo/ 一个是打包工具 fat jar exporterhttp://fjep.source

PostgreSQL 数据库开发规范

PostgreSQL 数据库开发规范 背景 PostgreSQL的功能非常强大,但是要把PostgreSQL用好,开发人员是非常关键的. 下面将针对PostgreSQL数据库原理与特性,输出一份开发规范,希望可以减少大家在使用PostgreSQL数据库过程中遇到的困惑. 目标是将PostgreSQL的功能.性能发挥好,她好我也好. PostgreSQL 使用规范 命名规范 [强制]库名.表名限制命名长度,建议表名及字段名字符总长度小于等于63. [强制]对象名(表名.列名.函数名.视图名.序列名

PostgreSQL ECPG ifdef include等预处理用法

PostgreSQL 社区版本的ecpg在一些预处理的用法上和Oracle的PROC有一些不一样的地方,使用者需要注意.例如社区版本的ecpg不支持c里面使用的#ifdef或者#ifndef这样的预处理语法,需要用其他写法来替代.所以你如果使用#ifdef这样的写法在.pgc里面,在使用ecpg编译时报错,你可能觉得很奇怪.例子 $ vi t.pgc #include <stdio.h> #include <stdlib.h> #include <pgtypes_numeri

运用Tomcat5和PostgreSQL配置开发JSP详解

js|sql|详解 至于安装方面的知识,这里不多说,要注意的两点就是: 1.安装Tomcat(jakarta-tomcat-5.0.28.exe) 2.安装PostgreSQL(postgresql-8.0-beta1-20040809.msi)(7.0和8.0版本都可以) 直接安装到c或d盘下就可,同时注意设置用户名和口令 比如:admin 123456,在以后访问数据库时会用到,另外PostgreSQL所在安装目录的磁盘的系统格式必须是NTFS的,否则装不下. 配置数据库的驱动:(Jdk14

Tomcat5和PostgreSQL配置开发JSP

至于安装方面的知识,这里不多说,要注意的两点就是: 1.安装Tomcat(jakarta-tomcat-5.0.28.exe) 2.安装PostgreSQL(postgresql-8.0-beta1-20040809.msi)(7.0和8.0版本都可以) 直接安装到c或d盘下就可,同时注意设置用户名和口令 比如:admin 123456,在以后访问数据库时会用到,另外PostgreSQL所在安装目录的磁盘的系统格式必须是NTFS的,否则装不下. 配置数据库的驱动:(Jdk14指的是你的jdk安装

jqm视频播放器,html5视频播放器,html5音乐播放器,html5播放器,video开发demo,html5视频播放示例,html5手机视频播放器

最近在论坛中看到了很多实用html5开发视频播放,音乐播放的功能,大部分都在寻找答案.因此我就在这里做一个demo,供大家相互学习.html5开发越来越流行了,而对于视频这一块也是必不可少的一部分.如何让你的网站占据优势,就要看你的功能和用户体验了.html5对video还是做了很多优惠的东西,我们使用起来很得心应手. 在过去 flash 是网页上最好的解决视频的方法,截至到目前还算是主流,像那些优酷之类的视频网站.虾米那样的在线音乐网站,仍然使用 flash 来提供播放服务.但是这种状况将会随

一天学会PostgreSQL应用开发与管理 - 1 如何搭建一套学习、开发PostgreSQL的环境

背景 万事开头难,搭建好一套学习.开发PostgreSQL的环境,是重中之重. 因为其他平台(Ubuntu, CentOS, MAC)的用户大多数都具备了自行安装数据库的能力,在这里我只写一个面向Windows用户的学习环境搭建文档. 分为三个部分,用户可以自由选择. 如果你想深入的学习PostgreSQL,建议搭建PostgreSQL on Linux的环境.如果你只是想将数据库使用在日常的应用开发工作中,有也不需要PG的其他附加插件的功能,那么你可以选择PostgreSQL on Win的环

一天学会PostgreSQL应用开发与管理 - 3 访问数据

背景 在线SQL平台 http://www.sqlfiddle.com/ 本章大纲 1. 使用PSQL 2. 使用Select语句 3. 使用游标 4. 行表达式 5. with和递归查询 6. 执行DML\DDL\DCL 7. 选择行 8. 使用序列 9. 使用默认值 10. 生成数据 11. 检查空值(NULL) 12. 时间和日期 13. 多个表协同工作 第一章 : 访问数据 1. 使用PSQL psql 是PostgreSQL软件包中的命令行工具,可以连接数据库,执行SQL. psql

一天学会PostgreSQL应用开发与管理 - 7 函数、存储过程和触发器

本章大纲 一.运算符与函数 1 逻辑运算 2 比较运算 3 算数 4 字符串 5 bytea 6 bit 7 规则表达式 8 日期.数字.字符串格式化输出 9 时间 10 枚举 11 几何 12 网络地址 13 全文检索 14 XML 15 JSON.JSONB 16 序列 17 条件表达式 18 数组 19 范围 20 聚合 21 窗口 22 子查询表达式 23 行与数组表达式 24 返回集合的函数 25 系统信息函数 26 系统管理函数 二.过程语言 1 语法 2 plpgsql函数内部结构