ecpg
ecpg — 嵌入式 SQL C 预处理器
大纲
ecpg [-v] [-t] [-I include-path] [-o outfile] file...
输入
ecpg接受下列命令行参数:
- -v
打印版本信息。
- -t
打开事务自动提交。在此模式下,除非查询位于显式事务块中,否则每条查询都会自动提交。在默认模式下,只有发出
exec sql commit时才会提交查询。- -I
include-path 指定一个额外的 include 路径。默认值是
.(当前目录)、/usr/local/include、编译时定义的 PostgreSQL include 路径(默认:/usr/local/pgsql/include)以及/usr/include。- -o
outfile 指定 ecpg 应将全部输出写入
outfile。如果没有给出这个选项,输出将写入(假定输入文件名为name.c)。如果输入文件确实没有预期的name.pgc.pgc后缀,那么输出文件名将在输入文件名后追加上.pgc。file要处理的文件。
输出
ecpg会创建一个文件或写入
stdout。
- Return value
ecpg成功完成时向 shell 返回 0,出错时返回非零值。
描述
ecpg 是 C 语言和 PostgreSQL的嵌入式 SQL 预处理器。它支持开发带有嵌入式 SQL 代码的 C 程序。
Linus Tolke(<linus@epact.se>)是
ecpg的原作者(直到 0.2 版)。Michael
Meskes(<meskes@debian.org>)是
ecpg目前的作者和维护者。Thomas
Good(<tomg@q8.nrnet.org>)是本文件所依据的
ecpg man 页最后一版的作者。
用法
为编译做预处理
嵌入式 SQL 源文件在编译之前必须先做预处理:
ecpg [ -d ] [ -ofile]file.pgc
其中可选的 -d 标志打开调试。.pgc
扩展名是表示 ecpg 源的一种随意约定。
你可能想把预处理器的输出重定向到一个日志文件。
编译和链接
假定 PostgreSQL 的可执行文件位于
/usr/local/pgsql,你需要这样编译和链接预处理后的源文件:
gcc -g -I /usr/local/pgsql/include [ -ofile]file.c -L /usr/local/pgsql/lib -lecpg -lpq
语法
库
预处理器会在源文件开头加上两条指令:
#include <ecpgtype.h> #include <ecpglib.h>
变量声明
在 ecpg 源代码中声明的变量必须以以下内容开头:
EXEC SQL BEGIN DECLARE SECTION;
类似地,变量声明节必须以以下内容结束:
EXEC SQL END DECLARE SECTION;
注意
在 2.1.0 版之前,每个变量必须单独一行声明。从 2.1.0 版起,多个变量可以在一行中声明:
char foo[16], bar[16];
错误处理
SQL 通信区用以下方式定义:
EXEC SQL INCLUDE sqlca;
注意
sqlca是小写的。虽然可以遵循 SQL
惯例(即用大写来区分嵌入式 SQL 与 C
语句),但sqlca(它包含
sqlca.h头文件)必须是小写的。这是因为
EXEC SQL 前缀表明这个包含将由
ecpg解析。ecpg
区分大小写(SQLCA.h将找不到)。只要注意大小写,EXEC SQL INCLUDE
也可用于包含其他头文件。
sqlprint命令与
EXEC SQL WHENEVER语句一起使用,在整个程序中打开错误处理:
EXEC SQL WHENEVER sqlerror sqlprint;
和
EXEC SQL WHENEVER not found sqlprint;
注意
这不是EXEC SQL WHENEVER语句用法的一个详尽示例。更多用法示例可以在
SQL 手册中找到(例如 Groff 和 Weinberg 的The LAN TIMES Guide to SQL)。
连接到数据库服务器
使用下面的语句连接数据库:
EXEC SQL CONNECT TO dbname;其中数据库名不带引号。在 2.1.0 版之前,数据库名必须放在单引号中。
也可以在 connect 语句中指定服务器名和端口名。语法是:
dbname[@server][:port]
或者
<tcp|unix>:postgresql://server[:port][/dbname][?options]
查询
一般来说,其他应用(如 psql)可接受的 SQL 查询都可以嵌入到你的 C 代码中。下面是一些示例。
创建表:
EXEC SQL CREATE TABLE foo (number int4, ascii char(16)); EXEC SQL CREATE UNIQUE index num1 on foo(number); EXEC SQL COMMIT;
插入:
EXEC SQL INSERT INTO foo (number, ascii) VALUES (9999, 'doodad'); EXEC SQL COMMIT;
删除:
EXEC SQL DELETE FROM foo WHERE number = 9999; EXEC SQL COMMIT;
单行 SELECT:
EXEC SQL SELECT foo INTO :FooBar FROM table1 WHERE ascii = 'doodad';
使用游标的 SELECT:
EXEC SQL DECLARE foo_bar CURSOR FOR
SELECT number, ascii FROM foo
ORDER BY ascii;
EXEC SQL FETCH foo_bar INTO :FooBar, DooDad;
...
EXEC SQL CLOSE foo_bar;
EXEC SQL COMMIT;
更新:
EXEC SQL UPDATE foo
SET ascii = 'foobar'
WHERE number = 9999;
EXEC SQL COMMIT;
注意
完整的结构定义必须列在 declare 节内。
更多尚未实现的功能请看源码中的 TODO 文件。