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)

字段數據類型的數值代碼