完全版 ESQL/C资料二( 五 )


lSqlerrmc:由0个或多个字符串组成,它对返回的值给予一个更详细的解释 。
lSqlerrp:包含一些对用户没有用的信息 。
lSqlwarn:包含了一些警告信息 。
lSqlstate:长度为5的字符串 。它表示SQL语句执行的结果 。它的每一个含义是遵循ANSI/SQL 92标准 。各个数据库产品的sqlstate域的含义都是相同的 。
为了更方便地读取sqlca中SQL语句执行后的结果或错误,DB2提供了一个函数——sqlaintp,它在sql.h中声明:sqlaintp(msgbuf,bufsize,linesize,sqlcaptr) 。其中msgbuf中存放信息;bufsize中存放了msgbuf的长度;linesize中存放了两个执行符之间的字符长度 。函数的返回值为正,代表信息的长度;为负代表没有信息返回 。
下面这个例子解释了sqlca和sqlaintp的使用方法:
int check_error (char eString[], struct sqlca *caPointer) {
char eBuffer[1024];
char sBuffer[1024];
short rc, Erc;
/*通过SQLCODE来判断是否出错*/
if (caPointer->sqlcode != 0) {
printf ("--- error report ---n");
printf ("ERROR occured : %s.nSQLCODE : %ldn", eString,
caPointer->sqlcode);
/* 获取SQLSTATE信息*/
rc = sqlogstt (sBuffer, 1024, 80, caPointer->sqlstate);
/*获取调用API的错误信息*/
Erc = sqlaintp (eBuffer, 1024, 80, caPointer);
/* Erc中存放了eBuffer 的长度*/
if (Erc > 0) printf ("%s", eBuffer);
if (caPointer->sqlcode < 0) { /*错误信息*/
if (rc == 0) {
printf ("n%s", sBuffer);
}
printf ("--- end error report ---n");
return 1;
} else {
/* 仅仅是警告信息 */
if (rc == 0) {
printf ("n%s", sBuffer);
}
printf ("--- end error report ---n");
printf ("WARNING - CONTINUING PROGRAM WITH WARNINGS!n");
return 0;
} /* endif */
} /* endif */
return 0;
}
在每条SQL语句执行后都返回一个SQLCA结构,SQLCA结构中记载了SQL语句执行后的结果信息 。用户可以根据返回信息执行各种操作 。DB2也提供了WHENEVER语句 。具体可参见SQL SERVER中的WHENEVER 。但是,在DB2中,没有WHENEVER…CALL这个处理 。
3.2.6事务
所谓事务,就是一系列应用程序和数据库之间交互操作的集合 。一旦一个事务开始执行,则事务中的操作要么全部执行,要么全部不执行 。
l事务开始:DB2事务是隐式开始的,除了下列的一些语句,其他任何一个可执行的SQL语句都隐式地开始一个事务 。
BEGIN DECLARE SECTION END DECLARE SECTION
DECLARE CURSOR INCLUDE SQLCA INCLUDE SQLDA
WHENEVER
l事务结束:事务由一个可执行的SQL语句开始,后面执行的所有SQL语句都将属于同一个事务,该事务一直遇到COMMIT或ROLLBACK命令时才结束 。
COMMIT操作的作用是,结束当前的事务,事务对数据库所做的修改永久化 。ROLLBACK的作用是,结束当前的事务,将被修改的数据恢复到事务执行以前的状态,即取消事务执行产生的影响 。当程序结束时,系统自动隐式地执行COMMIT操作,如果系统检测到死锁等故障,则隐式地执行ROLLBACK操作 。
3.3 DB2的嵌入SQL程序处理过程
嵌入SQL程序处理,由一个源程序创建为一个可执行文件的过程 。如下图所示:
图6-3 嵌入SQL处理过程
从上图看出,首先对源文件做预编译(precompiler),生成两个部分文件:一部分是纯的C程序源文件,它们和其他的C程序源文件一起,经过编译和连接生成可执行的程序(executable program);而另一部分是bind文件或package文件 。Bind文件经过binder操作以后,也生成为package文件 。所谓package,实际上是SQL语句的访问计划 。所以,预编译器将源程序中的SQL语句提出来,生成他们的访问计划,并将访问计划存放在数据库管理器中 。当执行程序并遇到访问数据库的命令时,它将到数据库管理器中寻找属于它的访问计划,然后按照访问计划中所设计的方法对数据库进行访问 。具体来说:

推荐阅读