GET DESCRIPTOR¶
在分配描述符之后,用户需要将动态查询语句的查询结果信息(包括查询结果和查询结果的结构信息)放入其中,然后,使用GET DESCRIPTOR语句从描述符中获得查询结果。
一种简单的方法是直接将查询结果放入分配的地址空间中,如:
EXEC SQL SELECT TABLENAME
INTO DESCRIPTOR desc_query FROM systables;
在以上语句中,把DESCRIPTOR放在INTO子句中,因为它用于存储结果信息,和输出主变量的作用是一样的,只是使用方法不同。
使用更多的是下面的方法:
EXEC SQL ALLOCATE DESCRIPTOR desc_query;
EXEC SQL PREPARE prep_query FROM :query;
EXEC SQL DECLARE cur_query CURSOR FOR prep_query;
EXEC SQL OPEN cur_query;
EXEC SQL FETCH cur_query INTO SQL DESCRIPTOR desc_query;
这种格式其实将方法2、方法3和方法四都结合在了一起。
将结果存入分配的地址空间之后,使用GET DESCIRPTOR命令获取结果信息,格式如下:
EXEC SQL GET DESCRIPTOR < 描述符名> VALUE <列序数>
:hv1 = item_name1[ {, :hvN = item_nameN] } ;
这里的<列序数>指定取回结果中相应序号的列,从1开始计数。上面的语句用于获取查询结果中第<列序数>列的信息。后面的item_name参数给出了需要获取的信息(比如列名、列的长度、列值等),hv表示存放返回结果的输出主变量。如果查询返回多行的话,那么相应的输出主变量也需要能够存储多行,否则,系统会给出二者个数不匹配的错误信息,并设置相应的错误码。这里,用户可以使用宿主数组变量。
例:
EXEC SQL BEGIN DECLARE SECTION;
char query[100];
int hlength;
char hname[120];
char hnum[4];
EXEC SQL END DECLARE SECTION;
strcpy(hnum, ''E2'');
strcpy(query, ''select * from employee where empnum = ?'');
EXEC SQL ALLOCATE DESCRIPTOR desc_query;
EXEC SQL PREPARE prep_query FROM :query;
EXEC SQL DECLARE cur_query CURSOR FOR prep_query;
EXEC SQL OPEN cur_query USING : hnum;
EXEC SQL FETCH cur_query INTO SQL DESCRIPTOR desc_query;
EXEC SQL GET DESCRIPTOR desc_query VALUE 1
:hlength = LENGTH, :hname=NAME;
通过上面的GET DESCRIPTOR语句获取了查询结果中第一列的长度、列名,分别放在宿主变量hlength、hname中。
下表给出了DESCRIPTOR各个item_name的名称和含义。
表 8-1
| Item_name名称 | 含义 |
|---|---|
| TYPE | 字段的数据类型 |
| LENGTH | 字段的长度,以字符为单位 |
| OCTET_LENGTH | 字段的长度,以字节为单位 |
| RETURNED_LENGTH | 取回的字段长度,以字符为单位 |
| RETURNED_OCTET_LENGTH | 取回的字段长度,以字节为单位 |
| PRECISION | 字段中的数字位数(对数字类型而言) |
| SCALE | 字段中的小数点后的数字位数(对数字类型而言) |
| NULLABLE | 字段是否允许空值,总是为1 |
| INDICATOR | 相应的指示变量的值 |
| DATA | 字段中的数据(列值) |
| NAME | 字段名(列名) |
| COUNT | 返回元组的数目 |
| KEY_MEMBER | 总是为0 |
| CARDINALITY | 结果集的势,即元组数 |
| DATETIME_INTERVAL_CODE | 日期、时间和时间段的类型 |
| DATETIME_INTERVAL_PRECISION | 日期、时间和时间段的精度 |