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)

字串資料類型的數值代碼