ecpg [ -v ] [ -t ] [ -I include-path ] [ -o outfile ] file1 [ file2 ] [ ... ]
ecpg 是一个嵌入的用于 Postgres和 C 语言的 SQL 预编译器. 她使得用嵌入的 SQL 代码书写 C 程序成为可能.
Linus Tolke(<[email protected]>) (又叫 Linus:)是 ecpg最初的作者(直到版本 0.2). Michael Meskes(<[email protected]>) 是目前的ecpg 的维护人员和作者. Thomas Good(<[email protected]>人真好:) 是ecpg 手册页最新版本的作者,这个手册页也是这份文档的基础.
在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 前缀表明这个 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 手册里找到(例如, `The LAN TIMES Guide to SQL' by Groff and Weinberg).
一种联接使用下面语句:
EXEC SQL CONNECT TO dbname;这里数据库名称没有用引号引起.在 2.1.0 以前, 数据库的名称要求被单引号引起.
在联接语句里声明服务器名和端口名也同样可以.语法是:
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;
单字段选择:
EXEC SQL SELECT foo INTO :FooBar FROM table1 WHERE ascii = 'doodad';
使用游标选择:
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;