更新时间:2024-06-03 GMT+08:00

SQLSTATE与SQLCODE

SQLSTATE是一个由五个字符组成的数组。这五个字符包含数字或大写字母,它表示多种错误或告警情况的代码。SQLSTATE具有一种层次模式:前两个字符表示情况的总体分类,后三个字符表示总体情况的子类。例如:代码00000表示成功状态。

SQLCODE是一个简单的整数形式。值为0表示成功,一个正值表示带附加信息的成功,一个负值表示错误。SQL标准只定义了正值+100,它表示上一个命令返回或者影响了零行,且没有特定的负值。

表1 SQLSTATE与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

指定了一个现有的游标名。

  • ecpg为嵌入式SQL新增加的SQLSTATE码有:22002、07001、07002、07006、07009、33000、42601、42804、42P03、YE000和YE001。其余SQLSTATE码沿用内核SQLSTATE码。
  • SQLSCODE为-400表示ecpg检测到内核服务器返回错误,其SQLSTATE为内核相应错误的SQLSTATE。