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

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


/*定義游標(biāo)*/
EXEC SQL DECLARE c1 CURSOR FOR s1;
strcpy( parm_var, "STAFF" );
/*打開游標(biāo),并用parm_var代替SELECT語句中的“?”參數(shù)*/
EXEC SQL OPEN c1 USING :parm_var;
CHECKERR ("OPEN");
do {
/*用FETCH語句從結(jié)果集中取出結(jié)果*/
EXEC SQL FETCH c1 INTO :table_name;
if (SQLCODE != 0) break;
printf( "Table = %sn", table_name );
} while ( 1 );
/*關(guān)閉游標(biāo)*/
EXEC SQL CLOSE c1;
CHECKERR ("CLOSE");
EXEC SQL COMMIT;
CHECKERR ("COMMIT");
EXEC SQL CONNECT RESET;
CHECKERR ("CONNECT RESET");
return 0;
}
/* end of program : DYNAMIC.SQC */
從上面這個(gè)例子看出,動(dòng)態(tài)SQL語句同靜態(tài)SQL語句的不同之處在于,要使用PREPARE語句操作具體的SQL語句,然后使用EXECUTE或者游標(biāo)等方式執(zhí)行 。
3.4.2 動(dòng)態(tài)游標(biāo)
1)、動(dòng)態(tài)游標(biāo)的DECLARE語句
動(dòng)態(tài)游標(biāo)對(duì)應(yīng)的SQL語句應(yīng)該是一個(gè)用PREPARE操作從文本形式轉(zhuǎn)換趁個(gè)可執(zhí)行形式的語句 。在上例子中: EXEC SQL DECLARE c1 CURSOR FOR s1; 其中s1就是PREPARE操作后的可執(zhí)行語句,c1是游標(biāo)的名字 。
2)、動(dòng)態(tài)游標(biāo)的OPEN語句
動(dòng)態(tài)OPEN操作的作用是:將宿主變量或SQLDA結(jié)構(gòu)中的值取出,填充到PREPARE操作后的SQL語句中標(biāo)有“?”的參數(shù)的位置,并執(zhí)行查詢 。宿主變量或SQLDA結(jié)構(gòu)中的值應(yīng)該與參數(shù)有一一對(duì)應(yīng)的關(guān)系,而且數(shù)據(jù)類型符合 。如上例子中:
EXEC SQL OPEN c1 USING :parm_var;
3)、動(dòng)態(tài)游標(biāo)的FETCH語句
FETCH語句是從結(jié)果集中取出一行,將結(jié)果送入宿主變量列表或SQLDA結(jié)構(gòu)中 。關(guān)于SQLDA結(jié)構(gòu),見下節(jié) 。如上例子中:
EXEC SQL FETCH c1 INTO :table_name;
3.4.3 SQLDA
SQLDA結(jié)構(gòu)的作用與宿主變量相同,可用于應(yīng)用程序與數(shù)據(jù)庫之間的數(shù)據(jù)交換,它適用于:在編寫程序時(shí)不確定要使用的變量個(gè)數(shù)和數(shù)據(jù)類型或不確定輸出數(shù)據(jù)的列數(shù),如:動(dòng)態(tài)輸入的SELECT語句,就必須使用SQLDA結(jié)構(gòu)來獲得查詢的數(shù)據(jù) 。SQLDA用于描述數(shù)據(jù)的類型、長度、變量的值和數(shù)據(jù)項(xiàng)的個(gè)數(shù) 。在應(yīng)用程序中使用SQLDA,必須在程序中定義SQLDA 。即加入以下語句:EXEC SQL INCLUDE SQLDA 。
1)、SQLDA結(jié)構(gòu)
SQLDA的定義存放在sqlda.h中 。具體為:
SQL_STRUCTURE sqlname /* Variable Name */
{
short length; /* Name length [1..30] */
_SQLOLDCHAR data[30]; /* Variable or Column name */
};
SQL_STRUCTURE sqlvar /* Variable Description */
{
short sqltype; /* Variable data type */
short sqllen; /* Variable data length */
_SQLOLDCHAR *SQL_POINTER sqldata; /* Pointer to variable data value */
short *SQL_POINTER sqlind; /* Pointer to Null indicator */
struct sqlname sqlname; /* Variable name */
};
SQL_STRUCTURE sqlda
{
_SQLOLDCHAR sqldaid[8]; /* Eye catcher = "SQLDA " */
long sqldabc; /* SQLDA size in bytes=16 44*SQLN */
short sqln; /* Number of SQLVAR elements */
short sqld; /* # of columns or host vars. */
struct sqlvar sqlvar[1]; /* first SQLVAR element */
};下圖形象的描述了用SQLDA來存放兩列數(shù)據(jù) 。SQLDA結(jié)構(gòu)
Sqld=2
sqlvar
……

Sqltype=500
Sqllen
sqldata
…..

Sqltype=501
Sqllen
Sqldata
…..圖6-4 SQLDA結(jié)構(gòu)示例從上面這個(gè)定義看出,SQLDA是一種由兩個(gè)不同部分組成的可變長數(shù)據(jù)結(jié)構(gòu) 。從位于SQLDA開端的sqldaid到sqld為固定部分,用于標(biāo)志該SQLDA,并規(guī)定這一特定的SQLDA的長度 。而后是一個(gè)或多個(gè)sqlvar結(jié)構(gòu) ,用于標(biāo)志列數(shù)據(jù) 。當(dāng)用SQLDA把參數(shù)送到執(zhí)行語句時(shí),每一個(gè)參數(shù)都是一個(gè)sqlvar結(jié)構(gòu);當(dāng)用SQLDA返回輸出列信息時(shí),每一列都是一個(gè)sqlvar結(jié)構(gòu) 。具體每個(gè)元素的含義為:
lSqldaid 。用于輸入標(biāo)志信息,如:“SQLDA” 。
lSqldabc 。SQLDA數(shù)據(jù)結(jié)果的長度 。應(yīng)該是16 44*SQLN 。Sqldaid、sqldabc、sqln和sqld的總長度為16個(gè)字節(jié) 。而sqlvar結(jié)構(gòu)的長度為44個(gè)字節(jié) 。
lSqln 。分配的Sqlvar結(jié)構(gòu)的個(gè)數(shù) 。等價(jià)于輸入?yún)?shù)的個(gè)數(shù)或輸出列的個(gè)數(shù) 。

推薦閱讀