转载:http://huangxiaojian9999.blog.163.com/blog/static/12129874220101103135228/
如果需要更强大的错误处理机制,那么嵌入的 SQL 接口提供了一个叫 sqlca 的全局变量,它是一个有着下面定义的结构:
struct { char sqlcaid[8]; long sqlabc; long sqlcode; struct { int sqlerrml; char sqlerrmc[70]; } sqlerrm; char sqlerrp[8]; long sqlerrd[6]; char sqlwarn[8]; char sqlstate[5]; } sqlca;
(在一个多线程的程序里,每个线程自动获得自己的 sqlca 的拷贝。这个方式类似于处理标准 C 全局变量 errno。)
sqlca 包含警告和错误。如果在一个语句的执行中出现多个警告或者错误,那么 sqlca 将只包含最后一个的信息。
如果在最后的 SQL 语句执行过程中没有发生错误, 那么 sqlca.sqlcode 将是 0 并且sqlca.sqlstate 将是"00000"。如果发生一个警告或者错误, 那么 sqlca.sqlcode 将是负数并且 sqlca.sqlstate 将不是 "00000"。一个正数的 sqlca.sqlcode 标识一种无害的条件,比如最后的查询返回零行。sqlcode 和 sqlstate 是两个不同的错误模式;下面详细介绍。
如果最后一条 SQL 语句成功,如果适合该具体命令,那么 sqlca.sqlerrd[1] 包含处理过的行的 OID,而 sqlca.sqlerrd[2] 包含 处理或返回的行数。
在发生错误或者警告的情况下,sqlca.sqlerrm.sqlerrmc 将包含一个描述该错误的字串。字段sqlca.sqlerrm.sqlerrml 包含存储在 sqlca.sqlerrm.sqlerrmc 里的错误信息的长度(DE
在发出警告的情况下,sqlca.sqlwarn[2] 被设置为 W。 (在所有其它的情况下,它都被设置为与 W不同的东西。)如果sqlca.sqlwarn[1] 设置为 W,那么就是一个数值在存储到宿主变量的时候被截断。 如果任何其它元素设置成表示一个警告,那么 sqlca.sqlwarn[0] 被设置为 W。
字段 sqlcaid,sqlcabc, sqlerrp 和剩下的 sqlerrd 以及 sqlwarn 元素目前没有包含有用的信息。
结构 sqlca 没有在 SQL 标准里定义,但是在好几个其它 SQL 数据库系统里定义了。 定义的核心都类似,但是如果你想写可以移植的应用,那么你应该仔细研究不同的实现。