SQLSTATE与SQLCODE
SQLSTATE是一个由五个字符组成的数组。这五个字符包含数字或大写字母,它表示多种错误或告警情况的代码。SQLSTATE具有一种层次模式:前两个字符表示情况的总体分类,后三个字符表示总体情况的子类。例如:代码00000表示成功状态
SQLCODE以整数的形式反映SQL语句的执行状态。具体而言:
- 零值标志着操作的成功执行;
- 正值通常指示成功但伴随附加信息,其中SQL标准仅明确定义了+100,用以表明上一条命令未对任何行产生影响或返回结果;
- 负值则揭示了执行过程中遭遇的错误。
值得注意的是,SQL标准并未对负值进行具体定义,它们通常由数据库系统自行规定以表示不同的错误情况。
- ecpg为嵌入式SQL新增加的SQLSTATE码有:22002、07001、07002、07006、07009、33000、42601、42804、42P03、YE000和YE001。其余SQLSTATE码沿用内核SQLSTATE码。
- SQLSCODE为-400表示ecpg检测到内核服务器返回错误,其SQLSTATE为内核相应错误的SQLSTATE。
| SQLCODE值 | SQLSTATE值 | 含义 |
|---|---|---|
| 0 (ECPG_NO_ERROR) | SQLSTATE 00000 | 表示没有错误。 |
| 100 (ECPG_NOT_FOUND) | SQLSTATE 02000 | 一种无害情况,它表示上一个命令检索或者处理了零行,或者已到达游标的末尾。 在循环中处理游标时,可以使用以下代码来检测何时中止该循环,示例如下: while (1)
{
EXEC SQL FETCH ... ;
if (sqlca.sqlcode == ECPG_NOT_FOUND)
break;
} 实际上WHENEVER NOT FOUND DO BREAK也会在内部这样做,所以一般不会直接使用这种方法。 |
| -12 (ECPG_OUT_OF_MEMORY) | SQLSTATE YE001 | 虚拟内存已被耗尽,数字值被定义为-ENOMEM。 |
| -200 (ECPG_UNSUPPORTED) | SQLSTATE YE000 | 预处理器产生了一些该库无法识别的内容。 |
| -201 (ECPG_TOO_MANY_ARGUMENTS) | SQLSTATE 07001 或 07002 | 表示命令指定的宿主变量数量超过该命令预期。 |
| -202 (ECPG_TOO_FEW_ARGUMENTS) | SQLSTATE 07001 或 07002 | 表示命令指定的宿主变量数量低于该命令预期。 |
| -203 (ECPG_TOO_MANY_MATCHES) | SQLSTATE 21000 | 表示一个查询已经返回了多行,但是该语句仅支持存储一个结果行。 |
| -204 (ECPG_INT_FORMAT) | SQLSTATE 42804 | 宿主变量是int类型,但数据库中的数据类型不同,且包含无法转换为int的值。该库使用strtol()进行转换。 |
| -205 (ECPG_UINT_FORMAT) | SQLSTATE 42804 | 宿主变量是unsigned int类型,但数据库中的数据类型不同,且包含无法转换为unsigned int的值。该库使用strtoul()进行转换。 |
| -206 (ECPG_FLOAT_FORMAT) | SQLSTATE 42804 | 宿主变量是float类型,但数据库中的数据类型不同,且包含无法转换为float的值。该库使用strtod()进行转换。 |
| -207 (ECPG_NUMERIC_FORMAT) | SQLSTATE 42804 | 宿主变量是numeric类型,但数据库中的数据类型不同,且包含无法转换为numeric的值。 |
| -208 (ECPG_INTERVAL_FORMAT) | SQLSTATE 42804 | 宿主变量是interval类型,但数据库中的数据类型不同,且包含无法转换为interval的值。 |
| -209 (ECPG_DATE_FORMAT) | SQLSTATE 42804 | 宿主变量是date类型,但数据库中的数据类型不同,且包含无法转换为date的值。 |
| -210 (ECPG_TIMESTAMP_FORMAT) | SQLSTATE 42804 | 宿主变量是timestamp类型,但数据库中的数据类型不同,且包含无法转换为timestamp的值。 |
| -211 (ECPG_CONVERT_BOOL) | SQLSTATE 42804 | 宿主变量是类型boolean而数据库中的数据既不是't'也不是'f'。 |
| -212 (ECPG_EMPTY) | SQLSTATE YE000 | 发送给SQL服务器的语句是空值(通常在一个嵌入式SQL程序中不会发生,因此它可能指向一个内部错误)。 |
| -213 (ECPG_MISSING_INDICATOR) | SQLSTATE 22002 | 返回了一个空值并且没有提供空值指示符。 |
| -214 (ECPG_NO_ARRAY) | SQLSTATE 42804 | 在要求一个数组的地方使用了一个普通变量。 |
| -215 (ECPG_DATA_NOT_ARRAY) | SQLSTATE 42804 | 在一个要求数组值的地方数据库返回了一个普通变量。 |
| -216 (ECPG_ARRAY_INSERT) | SQLSTATE 42804 | 该值不能被插入到数组中。 |
| -220 (ECPG_NO_CONN) | SQLSTATE 08003 | 程序尝试访问一个不存在的连接。 |
| -221 (ECPG_NOT_CONN) | SQLSTATE YE000 | 程序尝试访问一个存在的连接但是未被开启(这是一个内部错误)。 |
| -230 (ECPG_INVALID_STMT) | SQLSTATE 26000 | 尝试使用的语句还没有被准备好。 |
| -239 (ECPG_INFORMIX_DUPLICATE_KEY) | SQLSTATE 23505 | 重复键错误,违背唯一约束。 |
| -240 (ECPG_UNKNOWN_DESCRIPTOR) | SQLSTATE 33000 | 没有找到指定的描述符,尝试使用的语句未准备好。 |
| -241 (ECPG_INVALID_DESCRIPTOR_INDEX) | SQLSTATE 07009 | 指定的描述符超出范围。 |
| -242 (ECPG_UNKNOWN_DESCRIPTOR_ITEM) | SQLSTATE YE000 | 请求了一个非法的描述符(这是一个内部错误)。 |
| -243 (ECPG_VAR_NOT_NUMERIC) | SQLSTATE 07006 | 在执行一个动态语句期间,数据库返回了一个numeric值而宿主变量不是numeric类型的。 |
| -244 (ECPG_VAR_NOT_CHAR) | SQLSTATE 07006 | 在执行一个动态语句期间,数据库返回了一个非numeric值而宿主变量是numeric类型的。 |
| -284 (ECPG_INFORMIX_SUBSELECT_NOT_ONE) | SQLSTATE 21000 | 子查询的结果不是单一行。 |
| -400 (ECPG_PGSQL) | - | SQL服务器导致了某个错误。该消息包含来自SQL服务器的错误消息。 |
| -401 (ECPG_TRANS) | SQLSTATE 08007 | SQL服务器通知不能启动、提交或回滚事务。 |
| -402 (ECPG_CONNECT) | SQLSTATE 08001 | 无法建立数据库连接。 |
| -403 (ECPG_DUPLICATE_KEY) | SQLSTATE 23505 | 重复键错误,违背唯一约束。 |
| -404 (ECPG_SUBSELECT_NOT_ONE) | SQLSTATE 21000 | 子查询的结果不是单一行。 |
| -602 (ECPG_WARNING_UNKNOWN_PORTAL) | SQLSTATE 34000 | 指定了一个非法的游标名。 |
| -603 (ECPG_WARNING_IN_TRANSACTION) | SQLSTATE 25001 | 事务正在进行。 |
| -604 (ECPG_WARNING_NO_TRANSACTION) | SQLSTATE 25P01 | 没有活动(正在进行)的事务。 |
| -605 (ECPG_WARNING_PORTAL_EXISTS) | SQLSTATE 42P03 | 指定了一个现有的游标名。 |