↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0
历史版本PostgreSQL 7.2 已于 2007 年 2 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

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()是 ecpg的原作者(直到 0.2 版)。Michael Meskes()是 ecpg目前的作者和维护者。Thomas Good()是本文件所依据的 ecpg man 页最后一版的作者。

用法

为编译做预处理

嵌入式 SQL 源文件在编译之前必须先做预处理:

ecpg [ -d ] [ -o file ] file.pgc

其中可选的 -d 标志打开调试。.pgc 扩展名是表示 ecpg 源的一种随意约定。

你可能想把预处理器的输出重定向到一个日志文件。

编译和链接

假定 PostgreSQL 的可执行文件位于 /usr/local/pgsql,你需要这样编译和链接预处理后的源文件:

gcc -g -I /usr/local/pgsql/include [ -o file ] 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 文件。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。