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

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.0 已于 2005 年 5 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

ecpg

ecpg — 嵌入式 SQL C 预处理器

大纲

ecpg [ -v ] [ -t ] [ -I include-path ] [ -o outfile ]  file1 [ file2 ] [ ... ]
  

输入

ecpg接受下列命令行参数:

-v

打印版本信息。

-t

关闭自动事务(auto-transactin)模式。

-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 value

ecpg 成功完成时向 shell 返回 0,出错时返回 -1。

描述

ecpg 是 C 语言和 Postgres的嵌入式 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 源的一种随意约定。

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

编译和链接

假定 Postgres 的可执行文件位于 /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 头文件)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 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 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。