pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
ecpg — 嵌入式 SQL C 预处理器
ecpg [ -v ] [ -t ] [ -I include-path ] [ -o outfile ] file1 [ file2 ] [ ... ]
ecpg接受下列命令行参数:
打印版本信息。
关闭自动事务模式。
path指定一个额外的 include 路径。默认值是.、 /usr/local/include、编译时定义的 Postgres include 路径(默认: /usr/local/pgsql/lib)以及 /usr/include。
指定 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 文件。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。