↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

已结束支持的版本: 7.2 / 7.1
历史版本。 PostgreSQL 7.2 已结束支持。 请参阅 当前版本手册.

6.3. How To Use ecpg #

本节介绍如何使用 ecpg。

6.3.1. Preprocessor

预处理器叫做 ecpg。安装后它位于 PostgreSQL 的 bin/ 目录中。

6.3.2. Library

ecpg 库叫做 libecpg.a 或 libecpg.so。此外,该库用 libpq 库与 PostgreSQL 服务器通信。你必须用 -lecpg -lpq 链接你的程序。

这个库还有一些“隐藏”但可能证明有用的方法。

  • ECPGdebug(int on, FILE *stream) 在第一个参数非零时打开调试日志。Debug logging is done on stream. Most SQL statement log their arguments and results.

    最重要的函数 ECPGdo 会同时用展开后的字符串(即插入了所有输入变量的字符串)和 PostgreSQL 服务器的结果记录所有 SQL 语句。在查找 SQL 语句中的错误时这非常有用。

  • ECPGstatus() 这个方法在已连接到数据库时返回 TRUE,否则返回 FALSE。

6.3.3. 错误处理

为了检测来自 PostgreSQL 服务器的错误,包含像下面这样的一行:

exec sql include sqlca; 

这会定义一个结构以及一个名为 sqlca 的变量,如下:

struct sqlca
{
 char sqlcaid[8];
 long sqlabc;
 long sqlcode;
 struct
 {
  int sqlerrml;
  char sqlerrmc[70];
 } sqlerrm;
 char sqlerrp[8];
 long sqlerrd[6];
 /* 0: empty                                         */
 /* 1: OID of processed tuple if applicable          */
 /* 2: number of rows processed in an INSERT, UPDATE */
 /*    or DELETE statement                           */
 /* 3: empty                                         */
 /* 4: empty                                         */
 /* 5: empty                                         */
 char sqlwarn[8];
 /* 0: set to 'W' if at least one other is 'W'       */
 /* 1: if 'W' at least one character string          */
 /*    value was truncated when it was               */
 /*    stored into a host variable.                  */
 /* 2: empty                                         */
 /* 3: empty                                         */
 /* 4: empty                                         */
 /* 5: empty                                         */
 /* 6: empty                                         */
 /* 7: empty                                         */
 char sqlext[8];
} sqlca;

如果上一条 SQL 语句没有发生错误,sqlca.sqlcode 将为 0(ECPG_NO_ERROR)。如果 sqlca.sqlcode 小于零,这是严重的错误,例如数据库定义与查询不匹配。如果大于零,则是普通错误,例如表中没有所请求的行。

sqlca.sqlerrm.sqlerrmc 将包含一个描述错误的字符串。该字符串以源文件中的行号结尾。

可能发生的错误有:

-12, Out of memory in line %d.

通常不应出现。这表示你的虚拟内存已耗尽。

-200 (ECPG_UNSUPPORTED): Unsupported type %s on line %d.

通常不应出现。这表示预处理器生成了库不认识的内容。也许你运行的预处理器和库的版本不兼容。

-201 (ECPG_TOO_MANY_ARGUMENTS): Too many arguments line %d.

这表示 PostgreSQL 返回的参数比我们拥有的匹配变量多。也许你在 INTO :var1,:var2 列表中漏掉了几个宿主变量。

-202 (ECPG_TOO_FEW_ARGUMENTS): Too few arguments line %d.

这表示 PostgreSQL 返回的参数比我们拥有的宿主变量少。也许你在 INTO :var1,:var2 列表中放了太多宿主变量。

-203 (ECPG_TOO_MANY_MATCHES): Too many matches line %d.

这表示查询返回了多行,但指定的变量不是数组。SELECT 命令不唯一。

-204 (ECPG_INT_FORMAT): Not correctly formatted int type: %s line %d.

这表示宿主变量的类型是 int,而 PostgreSQL 数据库中的字段是另一种类型,包含不能被解释为 int 的值。库用 strtol() 做这个转换。

-205 (ECPG_UINT_FORMAT): Not correctly formatted unsigned type: %s line %d.

这表示宿主变量的类型是 unsigned int,而 PostgreSQL 数据库中的字段是另一种类型,包含不能被解释为 unsigned int 的值。库用 strtoul() 做这个转换。

-206 (ECPG_FLOAT_FORMAT): Not correctly formatted floating-point type: %s line %d.

这表示宿主变量的类型是 float,而 PostgreSQL 数据库中的字段是另一种类型,包含不能被解释为 float 的值。库用 strtod() 做这个转换。

-207 (ECPG_CONVERT_BOOL): Unable to convert %s to bool on line %d.

这表示宿主变量的类型是 bool,而 PostgreSQL 数据库中的字段既不是 't' 也不是 'f'。

-208 (ECPG_EMPTY): Empty query line %d.

PostgreSQL 返回了 PGRES_EMPTY_QUERY,很可能因为查询确实是空的。

-209 (ECPG_MISSING_INDICATOR): NULL value without indicator in line %d.

PostgreSQL 返回 ECPG_MISSING_INDICATOR,因为返回了 NULL 而没有提供 NULL 指示符变量。

-210 (ECPG_NO_ARRAY): Variable is not an array in line %d.

PostgreSQL 返回 ECPG_NO_ARRAY,因为在需要数组的地方使用了普通变量。

-211 (ECPG_DATA_NOT_ARRAY): Data read from backend is not an array in line %d.

PostgreSQL 返回 ECPG_DATA_NOT_ARRAY,因为数据库在需要数组值的地方返回了普通变量。

-220 (ECPG_NO_CONN): No such connection %s in line %d.

程序试图访问一个不存在的连接。

-221 (ECPG_NOT_CONN): Not connected in line %d.

程序试图访问一个确实存在但未打开的连接。

-230 (ECPG_INVALID_STMT): Invalid statement name %s in line %d.

你试图使用的语句还没有被准备。

-240 (ECPG_UNKNOWN_DESCRIPTOR): Descriptor %s not found in line %d.

找不到指定的描述符。你试图使用的语句还没有被准备。

-241 (ECPG_INVALID_DESCRIPTOR_INDEX): Descriptor index out of range in line %d.

指定的描述符索引超出范围。

-242 (ECPG_UNKNOWN_DESCRIPTOR_ITEM): Descriptor %s not found in line %d.

找不到指定的描述符。你试图使用的语句还没有被准备。

-243 (ECPG_VAR_NOT_NUMERIC): Variable is not a numeric type in line %d.

数据库返回了数值而变量不是数值型。

-244 (ECPG_VAR_NOT_CHAR): Variable is not a character type in line %d.

数据库返回了非数值而变量是数值型。

-400 (ECPG_PGSQL): Postgres error: %s line %d.

某种 PostgreSQL 错误。消息中包含来自 PostgreSQL 后端的错误消息。

-401 (ECPG_TRANS): Error in transaction processing line %d.

PostgreSQL 表示我们无法开始、提交或回滚事务。

-402 (ECPG_CONNECT): Could not connect to database %s in line %d.

连接数据库失败。

100 (ECPG_NOT_FOUND): Data not found line %d.

这是一个“正常”错误,告诉你所查询的内容找不到,或者你已经位于游标的末尾。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.