1 前言概述
动态SQL语句在编译时可能不知道有多少列信息。在ESQL语句中,这些不确定的数据是通过SQLDA完成的。理解SQLDA的结构是理解动态SQL的关键。SQLDA的结构可参考《C语言访问INFORMIX数据库 — SQLDA结构》,此篇主要通过代码来分析SQLDA的使用。[注意:此文是基于前一博文的补充,接口定义和类型定义请参考《C语言访问INFORMIX数据库 — 接口实现》]
2 用法分析
2.1 DESCRIBE ... INTO
在接口实现中的db_ifx_mquery()函数中有这样一段代码:
ifx_sqlda_t *sqlda = NULL;
...
EXEC SQL DESCRIBE QUERY_SQLSTMT_ID INTO sqlda;
代码段1
代码分析:
定义变量sqlda为一个空指针,但执行DESCRIBE ... INTO后,就能对sqlda进行其他操作处理了。我想这时每个人看到这里心中都有一个疑问:DESCRIBE ... INTO到底对空指针sqlda做了什么处理?
1) 分配空间
1. 定义变量sqlda为空指针,但DESCRIBE...INTO之后就能够进行操作,很显然,DESCRIBE...INTO为变量sqlda分配了内存空间
2. 分配的空间包括:sqlda和sqlda->sqlvar。且sqlda->sqlvar指向大小为sqld*sizeof(struct sqlvar_struct)内存块。(sqlvar:指向struct sqlvar_struct结构体,即指向描述第一列信息的sqlvar结构体)
3. 但未给sqlda->sqlvar中其他指针分配内存
2) 获取语句信息,并存放在ifx_sqlda_t结构中
获取的语句信息包括:
sqld:使用的sqlvar结构的个数,即:输出列的个数
sqlvar:指向struct sqlvar_struct结构体,即:指向描述第一列信息的sqlvar结构体
desc_name:sqlda名称
desc_occ:sqlda结构的大小
sqltype:代表参数或列的数据类型。它是一个整数数据类型代码。
sqllen:代表传送数据的长度
sqlname:代表列名或变量名