ESQL编程使用说明( 五 )


如果游标活动集中是空的,或所有的行已经被取走,COBASE就返回一代码.(USERCA.SQLCODE==2000).
游标只可在活动集中向前移动,COBASE无法取到已经用FETCH取过的行,要想再取这一行,就必须关闭游标,再重新打开它.
3.2.4 CLOSE CURSOR 关闭游标语句当取完活动集中所有行后,必须关闭游标,以释放与该游标的关的资源.其格式如下:EXEC SQL CLOSE <游 标名>;例题程序5 (使用游标的查询)/*=============================================================================
This is a sample program which uses Cursor.Include DECLARE,
OPEN,FETCH and CLOSE cursor name.
It is an example of how to do queries that return more than
one row.
==============================================================================*/
EXEC SQL BEGIN DECLARE SECTION ;
INT status;
CHAR sno[10],sname[15],city[20];
EXEC SQL END DECLARE SECTION ;
EXEC SQL INCLUDE USERCA;main()
{
int i;
printf("Now exec connect ...");
EXEC SQL CONNECT "cobase:cobase" ; /* log into COBASE */printf("Now exec declare_open_fetch_close cursor ...");
/* Declare statement name ---"s1" for INSERT statement */EXEC SQL DECLARE cursor1 CURSOR FOR SELECT * FROM S_TEST;EXEC SQL OPEN cursor1 ;printf("sno sname status cityn ");do
{EXEC SQL FETCH cursor1 INTO :sno,:sname,:status,:city ;
If (userca.sqlcode==2000) break;
printf("%8s %8s ?%8s n",sno,sname,status,city);getchar();
}while(1);EXEC SQL CLOSE cursor1 ;
EXEC SQL COMMIT;
EXEC SQL DISCONNECT;
}3.3 定位修改和删除语句COBASE支持SQL格式" CURRENT OF CURSOR".这条语句将指向一个游标中最新取出的行,以用于修改和删除操作.该语句必须在取操作之后使用 ,它等同于存储一个ROWID,并使用它.其格式如下:(1) EXEC SQL
UPDATE <表名>
SET <列名> = <值表达式> | NULL
[,<列名> = <值表达式> | NULL ....]
WHERE CURRENT OF <游标名> ;
(2) EXEC SQL
UPDATE <表名>
SET ( <列名表> ) = ( <子查询> )
WHERE CURRENT OF <游标名> ;
(3) EXEC SQL DELETE FROM <表名>
WHERE CURRENT OF <游标名> ;这些语句执行在游标名的当前行下更新或修改.其中在值表达式或子查询中出现的主变量前应有":"标志.例题程序6 (定位删除)/*==============================================================================
This is a sample program which uses DELETE STATEMENT at
CURRENT Cursor.
==============================================================================*/
EXEC SQL BEGIN DECLARE SECTION ;
INT status;
CHAR sno[10],sname[15],city[20];
EXEC SQL END DECLARE SECTION ;
EXEC SQL INCLUDE USERCA;main()
{
int i;
printf("Now exec connect ...");
EXEC SQL CONNECT "COBASE:COBASE" ;printf("Now exec declare cursor ...");
EXEC SQL DECLARE cursor1 CURSOR FOR
SELECT sno,sname,status,city FROM S_TEST FOR UPDATE;
printf("Now exec open cursor ...");
EXEC SQL OPEN cursor1;
printf("sno sname status cityn");
for(;;)
{
printf("Now exec fetch cursor ...n");
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(" delete current ?(0/1)");
scanf("%d",&i);
if (i==1)
EXEC SQL DELETE FROM S_TEST
WHERE CURRENT of cursor1;
}EXEC SQL CLOSE cursor1;
EXEC SQL COMMIT;
EXEC SQL DISCONNECT;
}
例题程序7 (定位修改)
/*=============================================================================
This is a sample program which uses UPDATE STATEMENT at
CURRENT Cursor.
==============================================================================*/
EXEC SQL BEGIN DECLARE SECTION ;
INT status;
CHAR sno[10],sname[15],city[20];
EXEC SQL END DECLARE SECTION ;
EXEC SQL INCLUDE USERCA;main()
{
int i;strcpy(sno,"ttttt");
strcpy(sname,"ttttt");
strcpy(city,"ttttt");
status=1000;

推荐阅读