然而,当您描述一准备好的 SELECT 语句,而该语句将数据从一列访存至 lvarchar 类型的主变量内时,DESCRIBE...USING SQL DESCRIPTOR 语句不为系统描述符区域的 DATA 字段分配内存。
在您将 lvarchar 数据访存至系统描述符区域之前,您必须显式地将内存指定到 DATA 字段来保存该列值,如下: 声明一大小恰当的 lvarchar 主变量。 请确保此变量不只是一个指针,而有与它相关联的内存。
以 SET DESCRIPTOR 语句将此主变量指定给 DATA 字段。 此 SET DESCRIPTOR 语句发生在 DESCRIBE...USING SQL DESCRIPTOR 语句之 后,但发生在 FETCH...USING SQL DESCRIPTOR 语句之前。
执行 FETCH...USING SQL DESCRIPTOR 语句来将列数据检索至系统描述符区域的 DATA 字段内。
下列代码段展示为 table1 表中的名为 lvarch_col 的 LVARCHAR 列分配内存的基 本步骤: EXEC SQL BEGIN DECLARE SECTION; lvarchar lvarch_val[50]; int i; EXEC SQL END DECLARE SECTION;
EXEC SQL allocate descriptor 'desc'; EXEC SQL prepare stmt1 from 'select opaque_col from table1'; EXEC SQL describe stmt1 using sql descriptor 'desc'; EXEC SQL declare cursor curs1 for stmt1; EXEC SQL open curs1; EXEC SQL set descriptor 'desc' value 1 data = :lvarch_val, length = 50;
GBase 8s ESQL/C 编程指南 南大通用数据技术股份有限公司 - 514 -
while (1) { EXEC SQL fetch curs1 using sql descriptor 'desc'; EXEC SQL get descriptor 'desc' value 1 :lvarch_val; printf("Column value is %s\n", lvarch_val);
⋮
}
前面的代码段不执行异常处理。 指定与从系统描述符区域获得值 下列 SQL 语句允许您的程序访问系统描述符区域的字段: SET DESCRIPTOR 语句将值指定给系统描述符区域的字段。 GET DESCRIPTOR 语句从系统描述符区域的字段获得值。 SET DESCRIPTOR 语句 要将值指定给系统描述符区域字段,请使用 SET DESCRIPTOR 语句。
您可使用 SET DESCRIPTOR 语句来: 设置 COUNT 字段, 来匹配您在系统描述符区域中提供其描述的项的数目。 此值通常 为 WHERE 子句中输入参数的数目。 EXEC SQL set descriptor sysdesc COUNT=:hostvar; 为您为其提供描述的每一列值设置项描述符字段。 EXEC SQL set descriptor sysdesc VALUE :item_numDESCRIP_FIELD=:hostvar;
设置字段值来为 WHERE 子句中的输入参数提供值(指定输入参数值) 或在您使用 DESCRIBE...USING SQL DESCRIPTOR 语句来填充系统描述 符区域之后,来修改项描述符字段的内容(将列值放至系统描述符区域 内)。
GBase 8s ESQL/C 编程指南 南大通用数据技术股份有限公司 - 515 - 数据库服务器在 sqltypes.h 头文件中提供数据类型常量,来标识系统描述符区域的 TYPE 字段 (及可选的 ITYPE 字段) 中列的数据类型。 然而, 您不可在 SET DESCRIPTOR 语句中直接地指定数据类型常量。相反,请将该常量值指定给整数主变量,并在 SET DESCRIPTOR 语句中指定此变量,如下: EXEC SQL BEGIN DECLARE SECTION; int i;
⋮
EXEC SQL END DECLARE SECTION;
⋮
i = SQLINT; EXEC SQL set descriptor 'desc1' VALUE 1 TYPE = :i;
带有描述符的 lvarchar 指针主变量
如果您随同使用系统描述符区域的 FETCH 或 PUT 语句使用 lvarchar 指针主变量, 则您必须显式地在 SET DESCRIPTOR 语句中将类型设置为 124 (CLVCHARPTRTYPE 来 自 incl/esql/sqltypes.h)。下列示例说明: EXEC SQL BEGIN DECLARE SECTION; lvarchar *lv; EXEC SQL END DECLARE SECTION; /* where tab has lvarchar * column */ EXEC SQL prepare stmt from "select col from tab"; EXEC SQL allocate descriptor 'd'; /* The following describe will return SQLLVARCHAR for the type of the column */ EXEC SQL describe stmt using sql descriptor 'd'; /* You must set type for *lv variable */ EXEC SQL set descriptor 'd' value 1 DATA = :lv, TYPE = 124;
GBase 8s ESQL/C 编程指南 南大通用数据技术股份有限公司 - 516 - EXEC SQL declare c cursor for stmt; EXEC SQL open c; EXEC SQL fetch c using sql descriptor 'd'; GET DESCRIPTOR 语句 GET DESCRIPTOR 语句从系统描述符区域字段获得值。
您可使用 GET DESCRIPTOR 语句来: 获得 COUNT 字段来确定在系统描述符区域中描述了多少个值。 EXEC SQL get descriptor sysdesc :hostvar=COUNT; 获得每一被描述的列的项描述符字段。 EXEC SQL get descriptor sysdesc VALUE :item_num :hostvar=DESCRIP_FIELD; 在此示例中,item_num 是对应于期望的列的项描述符的数目, DESCRIP_FIELD 是罗列在 表 1中的项描述符字段之一。
这些项描述符值通常是 SELECT、INSERT 或 EXECUTE FUNCTION 语句 中列的描述。还在 FETCH...USING SQL DESCRIPTOR 之后使用 GET DESCRIPTOR,来将由数据库服务器返回的列值从系统描述符区域复制 至主变量内(将列值放至系统描述符区域内)。
主变量的数据类型必须与相关联的系统描述符区域字段的类型相兼容。当 您在 TYPE 字段中说明时,请确保您使用的数据类型值与您的环境相匹配。对 于一些数据类型,X/Open 值不同于 GBase 8s 值。
指定输入参数值 由于 DESCRIBE...USING SQL DESCRIPTOR 语句不分析 WHERE 子句,因此,您 的程序必须在系统描述符区域的字段中存储输入参数的数目、数据类型和值,来显式地描 述这些参数。