/*定义游标*/
EXEC SQL DECLARE c1 CURSOR FOR s1;
strcpy( parm_var, "STAFF" );
/*打开游标,并用parm_var代替SELECT语句中的“?”参数*/
EXEC SQL OPEN c1 USING :parm_var;
CHECKERR ("OPEN");
do {
/*用FETCH语句从结果集中取出结果*/
EXEC SQL FETCH c1 INTO :table_name;
if (SQLCODE != 0) break;
printf( "Table = %sn", table_name );
} while ( 1 );
/*关闭游标*/
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 */
从上面这个例子看出,动态SQL语句同静态SQL语句的不同之处在于,要使用PREPARE语句操作具体的SQL语句,然后使用EXECUTE或者游标等方式执行 。
3.4.2 动态游标
1)、动态游标的DECLARE语句
动态游标对应的SQL语句应该是一个用PREPARE操作从文本形式转换趁个可执行形式的语句 。在上例子中: EXEC SQL DECLARE c1 CURSOR FOR s1; 其中s1就是PREPARE操作后的可执行语句,c1是游标的名字 。
2)、动态游标的OPEN语句
动态OPEN操作的作用是:将宿主变量或SQLDA结构中的值取出,填充到PREPARE操作后的SQL语句中标有“?”的参数的位置,并执行查询 。宿主变量或SQLDA结构中的值应该与参数有一一对应的关系,而且数据类型符合 。如上例子中:
EXEC SQL OPEN c1 USING :parm_var;
3)、动态游标的FETCH语句
FETCH语句是从结果集中取出一行,将结果送入宿主变量列表或SQLDA结构中 。关于SQLDA结构,见下节 。如上例子中:
EXEC SQL FETCH c1 INTO :table_name;
3.4.3 SQLDA
SQLDA结构的作用与宿主变量相同,可用于应用程序与数据库之间的数据交换,它适用于:在编写程序时不确定要使用的变量个数和数据类型或不确定输出数据的列数,如:动态输入的SELECT语句,就必须使用SQLDA结构来获得查询的数据 。SQLDA用于描述数据的类型、长度、变量的值和数据项的个数 。在应用程序中使用SQLDA,必须在程序中定义SQLDA 。即加入以下语句:EXEC SQL INCLUDE SQLDA 。
1)、SQLDA结构
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来存放两列数据 。SQLDA结构
Sqld=2
sqlvar
……
Sqltype=500
Sqllen
sqldata
…..
Sqltype=501
Sqllen
Sqldata
…..图6-4 SQLDA结构示例从上面这个定义看出,SQLDA是一种由两个不同部分组成的可变长数据结构 。从位于SQLDA开端的sqldaid到sqld为固定部分,用于标志该SQLDA,并规定这一特定的SQLDA的长度 。而后是一个或多个sqlvar结构 ,用于标志列数据 。当用SQLDA把参数送到执行语句时,每一个参数都是一个sqlvar结构;当用SQLDA返回输出列信息时,每一列都是一个sqlvar结构 。具体每个元素的含义为:
lSqldaid 。用于输入标志信息,如:“SQLDA” 。
lSqldabc 。SQLDA数据结果的长度 。应该是16 44*SQLN 。Sqldaid、sqldabc、sqln和sqld的总长度为16个字节 。而sqlvar结构的长度为44个字节 。
lSqln 。分配的Sqlvar结构的个数 。等价于输入参数的个数或输出列的个数 。
推荐阅读
- 坚果pro2哪个版本值得买?坚果pro2各版本有什么区别?
- F4版与D2版相比有何特点
- 坚果Pro 2有几个版本?坚果Pro 2各版本价格多少?
- 墨者写作中查看历史版本具体操作步骤
- 完全版 ESQL/C资料三
- kha苹果是什么版本
- 荒野乱斗九游版激活码在哪
- HTC U11国行版系统更新了什么?HTC U11国行版系统更新内容
- 小米MIX2黑色陶瓷版和全陶瓷尊享版哪个好?哪个更划算?
- 增补版 SCO UNIX快速入门
