
# SQLSTATE与SQLCODE
SQLSTATE是一个由五个字符组成的数组。这五个字符包含数字或大写字母，它表示多种错误或告警情况的代码。SQLSTATE具有一种层次模式：前两个字符表示情况的总体分类，后三个字符表示总体情况的子类。例如：代码00000表示成功状态。
SQLCODE是一个简单的整数形式。值为0表示成功，一个正值表示带附加信息的成功，一个负值表示错误。SQL标准只定义了正值+100，它表示上一个命令返回或者影响了零行，且没有特定的负值。
表1SQLSTATE与SQLCODE对应关系表 
| 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         | 指定了一个现有的游标名。                                                                                                                                                                                                                                                                                      |
   
![](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/public_sys-resources/caution_3.0-zh-cn.png)
- ecpg为嵌入式SQL新增加的SQLSTATE码有：22002、07001、07002、07006、07009、33000、42601、42804、42P03、YE000和YE001。其余SQLSTATE码沿用内核SQLSTATE码。
- SQLSCODE为-400表示ecpg检测到内核服务器返回错误，其SQLSTATE为内核相应错误的SQLSTATE。
 
