ESQL编程使用说明( 六 )


EXEC SQL CONNECT "cobase:cobase" ;EXEC SQL DECLARE cursor1 CURSOR FOR
SELECT SNO, SNAME, STATUS,CITY FROM S_TEST FOR UPDATE;
EXEC SQL OPEN cursor1;

printf("sno sname status cityn");
for(;;)
{
EXEC SQL FETCH cursor1 INTO :sno,:sname,:status,:city;
if (userca.sqlcode==2000) break;
printf("%8s %8s ?%8s n",sno,sname,status,city);
/* Delete the first record that be fetched */
printf(" update current ?(0/1)");
scanf("%d",&i);
if (i==1)
{printf("input sno=");
scanf("%s",sno);
printf("ninput sname=");
scanf("%s",sname);
printf("ninput status=");
scanf("%d",&status);
printf("ninput city=");
scanf("%s",city);
EXEC SQL UPDATE S_TEST SET sno=:sno,sname=:sname,status=:status,city=:city
WHERE CURRENT of cursor1;
EXEC SQL COMMIT;

}
}
EXEC SQL CLOSE cursor1;
EXEC SQL COMMIT;
EXEC SQL DISCONNECT;
}

第四章 提交/回滚事务
本章定义一事务或叫逻辑工作单元.为了保证数据库的一致性,在ESQL程序中,程序开发人员可以控制事务是否提交或回滚.一事务通常可以理解为一个完整程序对数据库进行的所有操作.一个事务也可以理解为是一个逻 辑工作单元.
4.1 逻辑工作单元一个逻辑工作单元是一组SQL语句和插入的主语言码的集合.COBASE把它们作为一个整体来处理.
在逻辑工作单元这一级上,COBASE保证了数据的一致性,这就意味着要么完成所有的操作,要么每条语句都不执行.
如果在处理一个逻辑工作单元期间出现了系统或用户程序失败,那么COBASE就自动把数据恢复到该逻辑工作单元开始之前的状态,程序失败时,COBASE检测完错误就恢复数据,若系统故障,COBASE在重新启动时恢复数据.
当遇 到第一个可执行的SQL语句(除了CONNECT)时,就隐含着一个逻辑工作单元的开始,COMMIT 和ROLLBACK语句结束一个逻辑工作单元.在ESQL程序中,说明语句并不开始一个逻辑单元.
COMMIT语句保证了当前逻辑单元上的所有操作都完整地提交给了数据库.ROLLBACK语句取消对当逻辑工作单元所作的操作 ,把数据库恢复到当前逻辑工作单元开始前的状态.
4.2 COMMIT 语句该语句结束当前逻辑工作单元,把在逻辑工作单元期们的所有变化提 交给数据库 .其格式如下:EXEC SQL COMMIT;在程序结束之前,应该明确地结束它的工作单元,否则,若程序成功结束后,COBASE自动提交所有的变换,若程序非正常结束,就恢复到最近 没有提交的逻辑工作单元.
COMMIT语句不影响主变量的内容 或主程序的控制流.
每条DDL语句的执行,自动发出COMMIT操作,这就是说 ,DDL语句跟在DML语句后面,那么以前的DML语句就自动提交组数据库.一个DDL语句结束当前逻辑工作单元,释放该程序拥有的所有锁.
4.3 ROLLBACK语 句该语句将数据库恢复到当前逻辑工作单元之前的状态,结束当前的逻辑工作单元.该语
句不影响主变量的内容或主程序的控制流.其格式如下:EXEC SQL ROLLBACK;
4.4 DISCONNECT 语句当应用程序不再使用COBASE数据库时,应该使用DISCONNECT语句释放程序所有与COBASE数据库有关的资源,并退出数据库,脱离COBASE环境.其格式如下:EXEC SQL DISCONNECT;

第 五 章 错误检测和恢复
本章我们介绍如何使用USERCA来进行错误检测和处理 。
5.1 USERCA的结构USERCA是ESQL程序用来传送执行信息的结构,每执行完一条执行性SQL语句, COBASE都把执行信息写入USERCA中,对于说明性SQL语句,则无执行信息.谨慎的程序员应该在每一SQL语句执行完成后,检查USERCA结构中内容来确信语句的执行是否成功,并根据其中的信息作适当的处理.在ESQL中,USERCA的结构如下:typedef struct
char caid[10]; /* userca ID */
long calen; /* userca length */
long sqlcode; /* sql code */
long sqltype; /* sql statement type */
int sqlerrmlen; /* sql error message length */

推荐阅读