将sql语句嵌入C代码中,然后通过 预处理器生成C编译的文件,最后执行编译。 一,编译 首先确定你的系统中装有开发包 dev-pg,dev-ecpg. 可通过 $sudo apt-get install dev-pg,dev-ecpg 安装 。 将写入的源码以.pgc格式保存。比如,prog.pgc 执行命令: $ ecpg -t prog.pgc 此时在当前目录下会生成prog.c的文件。开始 编译 $ gcc prog.c -o prog -I /usr/include/postgres/ -lpq -lecpg 二,连接数据库 URL: <protocol>:<service>://<machine>:<port>/<dbname>as <connection name> as <login name> using <password for login> 如: exec sql connect to tcp:postgresql://localhost:5432/dbdemo as connectname user 'noyear' using '123456'; 这样完成对本地机子postgresql服务的dbname数据库的连接,用户为noyear,密码 123456; 三,sqlca exec sql include sqlca 这条命令使得ecpg包含一个"sqlca.h"的头文件。其中包含sqlca结构体 struct sqlca { char sqlcaid[8]; long sqlabc; long sqlcode; struct { int sqlerrml; char sqlerrmc[70]; } sqlerrm; char sqlerrp[8]; long sqlerrd[6]; char sqlwarn[8]; char sqlext[8]; }; 在处理sqlca结构体时,首先检查sqlca.sqlcode,如果它小于零,说明出现了严 重错误;如果等于零,则一切正常;如果等于100则说明没有找到数据,但并不出 错。 如果INSERT,UPDATE或SELECT命令运行成功,则这些命令所影响的行数会保存在 sqlca.sqlerrd[2]中。 如果sqlca.sqlwarn[0]等于"W",说明有警告,通常是数据检索成功,但在转换成 主机变量时出了差错。 一旦出了错误, sql.sqlerrm.sqlerrmc能够提供错误描述信息。 四,其它; 在代码中 exec sql begin declare section; int age; VARCHAR name[50]; exec sql end declare section; 声明的age 和 name变量在C和sql中都是可见的。在C中正常引用 ,但在sql中要 使用要在变量前加“:”标志。如: exec sql SELECT fname into :name FROM stu WHERE age = 22; 检索NULL值。 构建指示变量, int . 如 : int ind_stu_age; 当我们执行 FETCH命令由游标取回数据时,需要指定实际 变量和指示变量,中间 用冒号连接: exec sql FETCH NEXT IN mycursor into :stu_age:ind_stu_age,:stu_name; 这样,如果ind_child_age的值为负,则表示 stu_age的数据是无意义的,即数据 库中对应的值为NULL。 五,实例: #include <stdlib.h> #include <stdio.h> exec sql include sqlca; exec sql begin declare section; int stu_age; VARCHAR stu_name[50]; int req_age; exec sql end declare section; main(){ exec sql connect to tcp:postgresql://localhost:5432/dbdemo as connection user 'postgres' using '123456'; exec sql BEGIN WORK; stu_age = 10; exec sql DECLARE mycursor CURSOR FOR SELECT age,name FROM stu WHERE age > :stu_age; exec sql OPEN mycursor; exec sql FETCH NEXT IN mycursor into :stu_age,:stu_name; if (sqlca.sqlcode < 0) printf("error code %d,message %s,rows %d,waring %c \n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc,sqlca.sqlerrd[2],sqlca.sqlwarn[0]); while (sqlca.sqlcode == 0 ){ if(sqlca.sqlcode >= 0) { stu_name.arr[sizeof(stu_name.arr)-1] = '\0'; printf("Stu name and age %s,%d \n",stu_name.arr,stu_age); } exec sql FETCH NEXT IN mycursor into :stu_age,:stu_name; if(sqlca.sqlcode < 0) { printf("error code %d,warning %c \n",sqlca.sqlwarn[0]); } } exec sql CLOSE mycursor; exec sql COMMIT WORK; exec sql disconnect all; return EXIT_SUCCESS; }
原文链接:https://www.f2er.com/postgresql/197047.html