29.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)

字段数据类型的数值代码