32.10. 使用描述符区域 #
SQL 描述符区域是一种处理SELECT或FETCH语句结果的高级方法。SQL 描述符区域将一行数据及其元数据项组合到一个数据结构中。在执行动态 SQL 语句时,结果列的性质可能无法提前获知,此时元数据特别有用。
一个 SQL 描述符区域由一个头部以及一个或多个条目描述符区域构成,头部包含与整个描述符相关的信息,而条目描述符区域则描述结果行中的每一列。
在使用 SQL 描述符区域之前,需要先分配一个:
EXEC SQL ALLOCATE DESCRIPTOR identifier;identifier 会作为该描述符区域的“变量名”。当不再需要该描述符时,应当释放它:
EXEC SQL DEALLOCATE DESCRIPTOR identifier;
要使用一个描述符区域,把它指定为INTO子句的存储目标(而不是列出主变量):
EXEC SQL FETCH NEXT FROM mycursor INTO DESCRIPTOR mydesc;
那么如何从描述符区域中取得数据呢?你可以把描述符区域当作一个包含命名字段的结构。要从头部取得某个字段的值并存入一个主变量,可使用以下命令:
EXEC SQL GET DESCRIPTORname:hostvar=field;
目前只定义了一个头部字段:COUNT,它表示存在多少个条目描述符区域(即结果中包含多少列)。主变量需要是整数类型。要从条目描述符区域取得一个字段,可使用以下命令:
EXEC SQL GET DESCRIPTORnameVALUEnum:hostvar=field;
num可以是一个整数字面量或者一个包含整数的宿主变量。可能的字段有:
CARDINALITY(integer)结果集中的行数
DATA实际的数据项(因此,这个字段的数据类型取决于查询)
DATETIME_INTERVAL_CODE(integer)?
DATETIME_INTERVAL_PRECISION(integer)没有实现
INDICATOR(integer)指示符(表示一个空值或者一个值截断)
KEY_MEMBER(integer)没有实现
LENGTH(integer)以字符计的数据长度
NAME(string)列名
NULLABLE(integer)没有实现
OCTET_LENGTH(integer)以字节计的数据字符表示的长度
PRECISION(integer)精度(用于类型
numeric)RETURNED_LENGTH(integer)以字符计的数据长度
RETURNED_OCTET_LENGTH(integer)以字节计的数据字符表示的长度
SCALE(integer)小数位数(用于类型
numeric)TYPE(integer)列的数据类型的数字编码