日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

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


(6)INSERT語(yǔ)句插入一新行 。【完全版 ESQL/C資料二】指定位置的UPDATE語(yǔ)句和DELETE語(yǔ)句游標(biāo)操作除了可以將多行的查詢結(jié)果返回給應(yīng)用程序,它還可以與UPDATE語(yǔ)句和DELETE相結(jié)合,根據(jù)游標(biāo)當(dāng)前的位置,對(duì)指針?biāo)傅倪@個(gè)行數(shù)據(jù)執(zhí)行UPDATE操作和DELETE操作 。它的語(yǔ)法為:
UPDATE…. WHERE CURRENT OF cursor_name
DELETE [FROM] {table_name | vIEw_name} WHERE CURRENT OF cursor_name
請(qǐng)看下面這個(gè)例子 。這個(gè)例子的作用是:將部門大于40的員工的工作改變?yōu)椤癱lerk”,部門小于等于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 */在通過(guò)游標(biāo)進(jìn)行UPDATE和DELETE操作時(shí),相應(yīng)的游標(biāo)在定義時(shí)必須加上FOR UPDATE子句 。操作時(shí),游標(biāo)必須打開(kāi),而且正指向一行數(shù)據(jù) 。
3.2.5 SQLCA
應(yīng)用程序執(zhí)行時(shí),每執(zhí)行一條SQL語(yǔ)句,就返回一個(gè)狀態(tài)符和一些附加信息 。這些信息反映了SQL語(yǔ)句或API的執(zhí)行情況,它有助于用戶分析應(yīng)用程序的錯(cuò)誤所在 。這些信息都存放在一個(gè)定義在sqlca.h的sqlca結(jié)構(gòu)中 。如果一個(gè)源文件中后SQL語(yǔ)句,則必須要在源程序中定義一個(gè)SQLCA結(jié)構(gòu),而且名為SQLCA 。最簡(jiǎn)單的定義方法是在源文件中加入一些語(yǔ)句:EXEC SQL INCLUDE sqlca.h
下面,我們首先看看SQLCA的結(jié)構(gòu):
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
};
結(jié)構(gòu)中各個(gè)字段的作用是:
lSqlcaid:包含字符串“SQLCA” 。
lSqlcabc:包含SQLCA結(jié)構(gòu)的長(zhǎng)度 。
lSqlcode:該值反映了SQL語(yǔ)句執(zhí)行后的狀態(tài),0表示SQL執(zhí)行成功;<0表示SQL語(yǔ)句執(zhí)行出錯(cuò);>0反映了一些特殊情況(如:沒(méi)有查詢結(jié)果) 。不同的數(shù)據(jù)庫(kù)產(chǎn)品,該值代表的含義可能不同 。
lSqlerrml:sqlerrmc域中數(shù)據(jù)的實(shí)際長(zhǎng)度 。

推薦閱讀