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 日期、时间和时间段的精度