4.6. 错误处理 #
嵌入式 SQL 接口提供了处理程序中异常条件的一种简单方法和一种复杂方法。第一种方法在某个条件发生时自动打印一条消息。例如:
EXEC SQL WHENEVER sqlerror sqlprint;
or
EXEC SQL WHENEVER not found sqlprint;
这种错误处理在整个程序期间保持启用。
注意
这不是 EXEC SQL WHENEVER 语句用法的详尽例子。更多用法示例可以在
SQL 手册中找到(例如 Groff 和 Weinberg 的
The LAN TIMES Guide to SQL)。
为了更强大的错误处理,嵌入式 SQL 接口提供了一个 struct 和一个名为
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.这表示服务器返回的参数比我们拥有的匹配变量多。也许你在
INTO :var1,:var2列表中漏掉了几个宿主变量。-202 (ECPG_TOO_FEW_ARGUMENTS): Too few arguments line %d.这表示服务器返回的参数比我们拥有的宿主变量少。也许你在
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.查询为空。(这在嵌入式 SQL 程序中通常不应发生,因此可能指向一个内部错误。)
-209 (ECPG_MISSING_INDICATOR): NULL value without indicator in line %d.返回了空值但没有提供空指示符变量。
-210 (ECPG_NO_ARRAY): Variable is not an array in line %d.在需要数组的地方使用了普通变量。
-211 (ECPG_DATA_NOT_ARRAY): Data read from backend is not an array in line %d.数据库在需要数组值的地方返回了普通变量。
-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.这是一个“正常”错误,告诉你所查询的内容找不到,或者你已经位于游标的末尾。