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


(6)INSERT语句插入一新行 。【完全版 ESQL/C资料二】指定位置的UPDATE语句和DELETE语句游标操作除了可以将多行的查询结果返回给应用程序,它还可以与UPDATE语句和DELETE相结合,根据游标当前的位置,对指针所指的这个行数据执行UPDATE操作和DELETE操作 。它的语法为:
UPDATE…. WHERE CURRENT OF cursor_name
DELETE [FROM] {table_name | vIEw_name} WHERE CURRENT OF cursor_name
请看下面这个例子 。这个例子的作用是:将部门大于40的员工的工作改变为“clerk”,部门小于等于40的员工信息删除 。
#include
#include
#include
#include "util.h"
EXEC SQL INCLUDE SQLCA;
#define CHECKERR(CE_STR) if (check_error (CE_STR, &sqlca) != 0) return 1;
int main(int argc, char *argv[]) {
EXEC SQL BEGIN DECLARE SECTION;
char pname[10];
short dept;
char userid[9];
char passwd[19];
EXEC SQL END DECLARE SECTION;
printf( "Sample C program: OPENFTCHn" );
if (argc == 1) {
EXEC SQL CONNECT TO sample;
CHECKERR ("CONNECT TO SAMPLE");
}
else if (argc == 3) {
strcpy (userid, argv[1]);
strcpy (passwd, argv[2]);
EXEC SQL CONNECT TO sample USER :userid USING :passwd;
CHECKERR ("CONNECT TO SAMPLE");
}
else {
printf ("nUSAGE: openftch [userid passwd]nn");
return 1;
} /* endif */
EXEC SQL DECLARE c1 CURSOR FOR
SELECT name, dept FROM staff WHERE job="Mgr"
FOR UPDATE OF job;
EXEC SQL OPEN c1;
CHECKERR ("OPEN CURSOR");

do {
EXEC SQL FETCH c1 INTO :pname, :dept;
if (SQLCODE != 0) break;

if (dept > 40) {
printf( "%-10.10s in dept. - will be demoted to Clerkn",
pname, dept );
EXEC SQL UPDATE staff SET job = "Clerk"
WHERE CURRENT OF c1;
CHECKERR ("UPDATE STAFF");
} else {
printf ("%-10.10s in dept. - will be DELETED!n",
pname, dept);
EXEC SQL DELETE FROM staff WHERE CURRENT OF c1;
CHECKERR ("DELETE");
} /* endif */
} while ( 1 );

EXEC SQL CLOSE c1;
CHECKERR ("CLOSE CURSOR");
EXEC SQL ROLLBACK;
CHECKERR ("ROLLBACK");
printf( "nOn second thought -- changes rolled back.n" );
EXEC SQL CONNECT RESET;
CHECKERR ("CONNECT RESET");
return 0;
}
/* end of program : OPENFTCH.SQC */在通过游标进行UPDATE和DELETE操作时,相应的游标在定义时必须加上FOR UPDATE子句 。操作时,游标必须打开,而且正指向一行数据 。
3.2.5 SQLCA
应用程序执行时,每执行一条SQL语句,就返回一个状态符和一些附加信息 。这些信息反映了SQL语句或API的执行情况,它有助于用户分析应用程序的错误所在 。这些信息都存放在一个定义在sqlca.h的sqlca结构中 。如果一个源文件中后SQL语句,则必须要在源程序中定义一个SQLCA结构,而且名为SQLCA 。最简单的定义方法是在源文件中加入一些语句:EXEC SQL INCLUDE sqlca.h
下面,我们首先看看SQLCA的结构:
SQL_STRUCTURE sqlca
{
_SQLOLDCHAR sqlcaid[8]; /* Eyecatcher = "SQLCA " */
long sqlcabc; /* SQLCA size in bytes = 136 */
#ifdef DB2_SQL92E
long sqlCADe; /* SQL return code */
#else
long sqlcode; /* SQL return code */
#endif
short sqlerrml; /* Length for SQLERRMC */
_SQLOLDCHAR sqlerrmc[70]; /* Error message tokens */
_SQLOLDCHAR sqlerrp[8]; /* Diagnostic information */
long sqlerrd[6]; /* Diagnostic information */
_SQLOLDCHAR sqlwarn[11]; /* Warning flags */
#ifdef DB2_SQL92E
_SQLOLDCHAR sqlstat[5]; /* State corresponding to SQLCODE */
#else
_SQLOLDCHAR sqlstate[5]; /* State corresponding to SQLCODE */
#endif
};
结构中各个字段的作用是:
lSqlcaid:包含字符串“SQLCA” 。
lSqlcabc:包含SQLCA结构的长度 。
lSqlcode:该值反映了SQL语句执行后的状态,0表示SQL执行成功;<0表示SQL语句执行出错;>0反映了一些特殊情况(如:没有查询结果) 。不同的数据库产品,该值代表的含义可能不同 。
lSqlerrml:sqlerrmc域中数据的实际长度 。

推荐阅读