30.8. 使用 SQL 描述符范围

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 DESCRIPTOR name :hostvar = field;

目前只定义了一个头字段:COUNT,这个字段 告诉我们有几个项描述符范围存在(也就是说,在结果里包含多少个字段)。 宿主变量需要是一个整数类型。要从项描述符范围里获取一个字段, 使用下面的命令:

EXEC SQL GET DESCRIPTOR name VALUE num :hostvar = field;

num 可以是一个字符整数或者一个包含整数的 宿主变量。可能的 field 有:

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)

字段数据类型的数值代码