DB2 sqlcode sqlstate 说明
在DB2数据库管理系统中,当你执行SQL语句时,可能会遇到各种错误情况。DB2通过返回`sqlcode`和`sqlstate`来告知用户具体的错误信息,帮助开发者和管理员理解并解决问题。`sqlcode`是一个整数值,通常负值表示错误,正值表示警告,而`sqlstate`则是一个五位的字母数字代码,提供了更详细的错误分类。 1. **成功完成**: - `sqlcode=0`, `sqlstate=00000`:表示SQL语句执行成功,没有错误或警告。 2. **警告**: - `sqlcode=12`, `sqlstate=01545`:未限定的列名被解释为一个有相互关系的引用。 - `sqlcode=98`, `sqlstate=01568`:动态SQL语句以分号结束,这在某些情况下可能不是预期的行为。 3. **找不到匹配项**: - `sqlcode=100`, `sqlstate=02000`:没有找到满足SQL语句的行,通常是SELECT语句未找到匹配记录。 - `sqlcode=110`, `sqlstate=01561`:用DATA CAPTURE定义的表的更新操作不能发送到原来的子系统。 4. **索引和表空间问题**: - `sqlcode=117`, `sqlstate=01525`:要插入的值的个数不等于被插入表的列数,可能是INSERT语句列和值的数量不匹配。 - `sqlcode=162`, `sqlstate=01514`:指定的表空间被置为检查挂起状态,这意味着表空间不能用于数据操作。 5. **命名和对象定义**: - `sqlcode=203`, `sqlstate=01552`:使用非唯一的名字来解决命名的限定列,可能导致歧义。 - `sqlcode=204`, `sqlstate=01532`:命名的对象未在DB2中定义,可能是对象不存在或拼写错误。 - `sqlcode=206`, `sqlstate=01533`:命名的列不在SQL语句中指定的任何表中存在,检查列名是否正确。 6. **远程对象和计划**: - `sqlcode=218`, `sqlstate=01537`:因为SQL语句引用一个远程对象,无法执行EXPLAIN操作。 - `sqlcode=219`, `sqlstate=01532`:命名的PLAN TABLE不存在,可能需要创建或检查PLAN TABLE的定义。 - `sqlcode=220`, `sqlstate=01546`:PLAN TABLE的命名列定义不正确,检查列定义。 7. **数据类型和SQLDA问题**: - `sqlcode=236`, `sqlstate=01005`:SQLDA中的SQLN值至少应等于所描述的列的个数,确保SQLDA结构与实际列数匹配。 - `sqlcode=237`, `sqlstate=01594`:至少有一个被描述的列应该是单值类型,扩展的SQLVAR条目需要额外空间。 - `sqlcode=238`, `sqlstate=01005`:至少应有一个被描述的列是一个LOB,因此需要额外空间。 - `sqlcode=239`, `sqlstate=01005`:至少应有一个被描述的列是单值类型,扩展的SQLVAR条目需要额外空间。 8. **数据类型和值的范围**: - `sqlcode=304`, `sqlstate=01515`:值超出宿主变量的数据类型范围,检查赋值是否合法。 - `sqlcode=331`, `sqlstate=01520`:不能被翻译的字符串,因此被设置为NULL,可能是字符编码问题。 - `sqlcode=339`, `sqlstate=01569`:可能存在的字符转换问题,与DB2 2.2版本的子系统连接有关。 9. **优化和提示**: - `sqlcode=394`, `sqlstate=01629`:使用优化提示来选择访问路径,优化SQL性能。 - `sqlcode=395`, `sqlstate=01628`:设置了无效的优化提示,忽略该提示。 10. **权限和授权**: - `sqlcode=402`, `sqlstate=01521`:未知的位置,可能在授权语句中使用了错误的参数。 - `sqlcode=403`, `sqlstate=01522`:本地不存在CREATE ALIAS对象,检查ALIAS的定义。 - `sqlcode=434`, `sqlstate=01608`:指定的特性在DB2的未来版本中将不被支持,建议停止使用。 11. **其他错误**: - `sqlcode=445`, `sqlstate=01004`:值被CAST函数截取,可能超过了目标数据类型的最大长度。 - `sqlcode=462`, `sqlstate=01Hxx`:用户定义的函数或存储过程发出的警告。 - `sqlcode=464`, `sqlstate=01609`:命名的存储过程超过返回的查询结果集数量限制。 - `sqlcode=466`, `sqlstate=01610`:指定由存储过程返回的查询结果集的个数,成功完成。 - `sqlcode=494`, `sqlstate=01614`:存储过程返回的结果集数量超过了ASSOCIATE LOCATORS指定的结果集定位器个数。 - `sqlcode=495`, `sqlstate=01616`:倒台SQL的成本估算超过警告阈值,发出警告。 12. **键、约束和索引**: - `sqlcode=535`, `sqlstate=01591`:请求主键的定位更新或请求使用自我引用约束的表的删除操作。 - `sqlcode=541`, `sqlstate=01543`:命名外键是一个重复的引用约束。 - `sqlcode=551`, `sqlstate=01548`:命名的授权ID缺少执行命名操作的权限。 - `sqlcode=552`, `sqlstate=01542`:命名的授权ID缺少在命名的DB2对象上的执行权限。 - `sqlcode=558`, `sqlstate=01516`:已经对PUBLIC授权,WITH GRANT OPTION不可用。 - `sqlcode=561`, `sqlstate=01523`:对ALTER REFERENCES INDEX 和 TRIGGER 特权,PUBLIC AT ALL ALLOCATION无效。 - `sqlcode=562`, `sqlstate=01560`:因GRANTEE已经拥有这些特权,所以一个或多个特权被忽略。 13. **模式、函数和存储过程**: - `sqlcode=585`, `sqlstate=01625`:模式名指定了不止一次,可能导致命名冲突。 - `sqlcode=599`, `sqlstate=01596`:没有为长字符数据类型(BLOB,CLOB 和 DBCLOB)建立比较函数,可能影响到对这些类型的数据的操作。 - `sqlcode=610`, `sqlstate=01566`:由于建立了一个DEFER YES的索引或ALTER INDEX改变了关键值的范围,对象处于PENDING状态。 - `sqlcode=625`, `sqlstate=01518`:因为删除了主键索引,所以表定义被标注为不完整。 - `sqlcode=626`, `sqlstate=01529`:删除了加强UNIQUE约束的索引,唯一性不再被加强。 - `sqlcode=645`, `sqlstate=01528`:因为建立的索引中没有包含NULL,WHERE NOT NULL被忽略。 - `sqlcode=650`, `sqlstate=01538`:不能更改或建立已命名的表为从属表。 - `sqlcode=653`, `sqlstate=01551`:在已指定的分区表空间中尚未建立指定的分区索引,所以分区索引不可得。 - `sqlcode=655`, `sqlstate=01597`:CREATE或ALTER STOGROUP语句中指定特定或非特定的卷ID,在DB2较新版本中不再支持。 - `sqlcode=658`, `sqlstate=0