星海's Blog

老头初学编程
IBM Informix ESQL/C Programmers Manual读书笔记(九)
IBM Informix ESQL/C Programmers Manual读书笔记(十一)

IBM Informix ESQL/C Programmers Manual读书笔记(十)

星海 posted @ 2012年6月07日 00:37 in 数据库 , 1467 阅读

注意:为之前学习INFORMIX时笔记,有错误,未审阅和进一步学习

最好比对英文原版

 

/* 动态管理数据结构 */
1,system-descriptor area,系统描述符区域,是遵循X/Open标准的数据结构,
ALLOCATE DESCRIPTOR, GET DESCRIPTOR, SET DESCRIPTOR, and DEALLOCATE DESCRIPTOR.

2,sqlda是用C语言构建的数据结构,与X/Open标准不同。


/* 系统描述符区域 */
系统描述符区域是ESQL/C为控制返回、发送数据而分配的一块内存区域。
有两个部份:

1),定长部份:COUNT字段,包括系统描述符区域列的数目。
由 DESCRIBE...USING SQL DESCRIPTOR 语句设定COUNT。在发送列值到数据库服务器前,
必须使用 SET DESCRIPTOR 语句来初始化此字段。

2),变长部份:包括系统描述符区域每个值的定长描述符。
每个描述符包含以下内容:

Field       DATA TYPE       Description
***************************************************************************
DATA        char *          列数据的指针
TYPE        short           表示列数据的类型,在sqltypes.h和sqlxtype.h中定义
LENGTH      short           类型的长度,单位为字节
NAME        char *          列名或正被传输的label
INDICATOR   short           值为0,表示DATA字段包括非NULL数据
                            值为-1,表示没有指定数据值是插入NULL
SCALE       short           数据段中列数据的等级,仅被DECIMAL和MONEY类型定义
PRECISION   short           列数据的精度,仅被DECIMAL和MONEY类型定义
NULLABLE    short           列是否可以包含NULL1,允许,0,不允许
IDATA       char *          用户自定义指示数据或指示变量数据段
ITYPE       short           用户自定义指示变量类型
ILENGTH     short           用户自定义指示变量长度
EXTYPEID    int4            用户自定义(opaque或distinct)或复合(集合或行)类型
                                       数据的扩展标识符。
EXTYPEID    int4            扩展数据名字
ETYPELENGTH short           扩展名字段的长度,单位为字节
EXTYPEOWNERNAME     char*   用户自定义和符合数据类型拥有者的名字
EXTYPEOWNERLENGTH   short   名字的长度
SOURCEID    int4            distinct-type 列源数据的扩展类型。


/* sqlda数据结构 */
sqlda结构有3部份:

1),定长部份:sqlda结构中列字段的数目,由 DESCRIBE...INTO 语句设定sqld字段。

2),变长部份:每个值的sqlvar_struct数据结构,sqlvar_struct为定长数据结构。
sqlda结构中的sqlvar字段指向sqlvar_struct结构数组的起始地址。每一个
sqlvar_struct结构对应一个数据信息。
/* struct sqlvar_struct结构 */

Filed       Data Type       Description
****************************************************************************
sqltype     short           列数据的类型
sqllen      short
sqldata     char *          列数据的指针
sqlind      short *         列数据指示变量的指针。值为0,有非NULL。值为-1,NULL
sqlname     char *          列数据的名字或者label名
sqlformat   char *          保留字段
sqlitype    short           自定义指示变量数据类型
sqlidata    char *          指向用户自定义指示变量数据的指针
sqlxid      int4            扩展标识符
sqltypename char *          扩展类型名字,用户自定义(opaque或distinct)或复合(
                             集合或行)类型名字
sqltypelen  short           扩展类型名字长度。
sqlownerlen short           扩展类型拥有者名字
sqlsourcetype short         内建的distinct源数据类型
sqlsourceid int4            扩展类型中的源类型
sqlflags    int4           



3),sqlda自己的描述信息。

Filed       Data Type       Description
****************************************************************************
desc_name   char[19]        描述符名字
desc_occ    short           sqlda数据结构大小
desc_next   struct sqlda *  下一个sqlda结构

DESCRIBE 语句可以在以下数据结构中写信息
1,DESCRIBE...USING SQL DESCRIPTOR 在系统描述符区域存储信息。可以通过 GET
DESCRIBE 语句获取这些信息。
2,DESCRIBE...INTO sqlda_ptr 在sqlda_ptr指针所指向的sqlda结构中存储信息。


如果DESCRIBE成功:
SQLCODE值指示准备好的语句类型。
sqlstype.h头文件中定义了SQL语句类型的常量。检查SQLCODE对应的值确定语句。
如果DESCRIBE语句描述了DELETE或UPDATE,可以指示语句段是否有WHERE子句。

sqltypes.h头文件包含Informix ESQL/C指定的SQL数据类型常量,默认为DESCRIBE使用。
sqlxtype.h定义了X/Open SQL数据类型常量。DESCRIBE在你编译.ec文件使用了-xopen预
处理选项时使用。

/* 探测输入参数 */
你可以使用 DESCRIBE 和 DESCRIBE INPUT 为一个已经准备好但还没有执行的语句返回输
入参数信息。
DESCRIBE INPUT 语句返回值的数量,数据类型,大小,列的名字或者查询表达式。可返回:

带有 IN、BETWEEN、HAVING、ON 子句的 SELECT 语句
SELECT 子查询
SELECT INTO TEMP
DELECT
EXECUTE

/* 带有 WHERE 子句的 INSERT\UPDATE 语句 */
/* 在DESCRIBE分析一个预备好的DELETE和UPDATE语句时,如果包含WHERE子句,设定
 * sqlca.sqlwarn.sqlwarn0 和 sqlca.sqlwarn.sqlwarn4 字段为W。设定SQLSTATE值为
 * Informix指定警告值,"01I07"。
 */

/* 操作未知语句信息 */
1),定义动态管理结构获取信息。可以是系统描述符区域或者SQLDA结构。
2),使用DESCRIBE语句检查准备好的SELECT语句和描述的各列。
3),指定动态管理结构定位从数据库获取的数据。

/* 使用Fetch数组 */
单一 FETCH 语句从fetch缓冲区到sqlda结构的行数。可由fetch数组增加。
当你fetch simple-large-object时特别有用。

如果不使用fetch数组获取simple large object:
当ESQL/C fetch一个TEXT或BYTE列时,服务器返回列的描述符。
ESQL/C随后请求服务器发送相应的数据。

如果使用fetch数组:
ESQL/C发送一系列的simple-large-object描述符给数据库服务器
数据库服务器在同一时间发送所有的数据。


 


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter