ecpg
ecpg — 嵌入式 SQL C 预处理器
大纲
ecpg [ -v ] [ -t ] [ -I include-path ] [ -o outfile ] file1 [ file2 ] [ ... ]
输入
ecpg接受下列命令行参数:
- -v
打印版本信息。
- -t
关闭自动事务模式。
- -I
path 指定一个额外的 include 路径。默认值是
.、/usr/local/include、编译时定义的 Postgres include 路径(默认:/usr/local/pgsql/lib)以及/usr/include。- -o
指定 ecpg 应将全部输出写入 outfile。如果没有给出这个选项,输出将写入
(假定输入文件名为name.c)。如果输入文件确实没有预期的name.pgc.pgc后缀,那么输出文件名将在输入文件名后追加上.pgc。file要处理的文件。
输出
ecpg会创建一个文件或写入
stdout。
return valueecpg成功完成时向 shell 返回 0,出错时返回 -1。
描述
ecpg 是 C 语言和 Postgres的嵌入式 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 源的一种随意约定。
你可能想把预处理器的输出重定向到一个日志文件。
编译和链接
假定 Postgres 的可执行文件位于
/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
头文件)MUST 是小写的。这是因为 EXEC SQL
前缀表明这个 INCLUDE
将由 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;
注意
没有 EXEC SQL PREPARE 语句。
完整的结构定义 MUST 列在 declare 节内。
更多尚未实现的功能请看源码中的 TODO 文件。