每次执行一次 SQL 就会更新一次 sqlca, 所以这个结构只记录最近一次执行SQL 的信息 . 错误消息是记录在sqlca.sqlerrm.sqlerrmc 里面的. 所以会把这个里面的字符串写入message stack. 但是sqlerrmc 最多只能记录70 个字符, 所以如果错误消息很长的话, 就会被截断.
上面的SQL 发生错误的话, pouersql () 返回值为 TRUE. 那么在调用这个函数的地方, 比如 rvtpt.lpc 文件中, 就会捕捉到这个返回值, 判断返回值之后确定发生error 了, 就会调用:
pouertrace( "RVTUQ", "000", "rvtuqdebitmemo()" )pouertrace () 这个函数也是在pouer.lpc 文件中定义的, 这个函数的返回值总是 false. 它的主要作用也是把错误消息写入 message stack. 三个参数分别为:
file: 表示发生错误的文件
location: 表示错误的位置
subroutine: 表示发生错误的函数.
上面我们提到, sqlerrmc 只能保存70 个字符. 如果错误消息多余70 个字符, 想要得到所有的错误消息的话, 就需要用 sqlglm() 函数. 在使用这个函数之前, 我们要确保 sqlcode < 0, 否则取出来的错误消息是前面的SQL 的消息.
if (pouersql("RVTUQ","019",TRUE))
{
char msg[510];
size_t buf_len, msg_len;
buf_len = sizeof (msg);
sqlglm(msg, &buf_len, &msg_len);
strcpy((char *)strbuf,"");
sprintf((char *)strbuf,"RVTUQ:001 YU SQL ERROR %s \n", (text *) msg);
Debug(strbuf,TRUE,TRUE);
return( FALSE );
} sqlglm() 函数把错误消息写入 msg, 然后只要把 msg 用 Debug() 函数写入日志就可以了. sqlglm() 函数对字数也有限制, 最大为512 个字符. 相比 sqlerrmc 的70 个字符多很多了.