2. SQL 语句
本章节描述了由 GBase 8s 识别的 SQL 语句的语法和定义。
这些 SQL 语句描述按字母顺序显示。
对于某些语句,重要的语义详细信息显示在此文档集合的其它卷中,如交叉引用所指出的。
对于许多语句、语法图和/或紧跟语法图后的项表,包括了对 数据类型和表达式 或 其它语法段 中 的语法段的引用。
当 SQL 语句的名称包括小写字符(如“ SET Database Object Mode ”)时。表示语句名称中的第一 个大小写混合的字符串不是 SQL 关键字,而是表示两个或更多个不同的 SQL 关键字可以跟在前 面的大写关键字后面。
对于语句描述的结构说明,请参阅 SQL 语法概述 。
2.1 ALLOCATE COLLECTION 语句
使用 ALLOCATE COLLECTION 语句为集合数据类型的变量(例如 LIST 、MULTISET 或 SET )或未归类的集合变量分配内存。
用法
该语句是 SQL ANSI/ISO 标准的扩展。在 ESQL/C 中使用此语句。
ALLOCATE COLLECTION 语句为可以存储 collection 数据类型的值的 ESQL/C 变量分配内存。
要为 GBase 8s ESQL/C 程序创建集合变量:
1. 在 GBase 8s ESQL/C 程序中作为客户机集合变量声明集合变量。 集合变量可以是已归类或未归类的集合变量。
2. 使用 ALLOCATE COLLECTION 语句为集合变量分配内存。 如果分配内存成功,ALLOCATE COLLECTION 语句会将 SQLCODE (也就是 sqlca.sqlcode)置 零(0);如果失败,会将其设置成一个负数错误码。
当不再需要集合变量时,您必须使用 DEALLOCATE COLLECTION 语句显示地释放内存。在 DEALLOCATE COLLECTION 语句执行成功后,您可以重新使用该集合变量。
提示: ALLOCATE COLLECTION 语句仅为 GBase 8s ESQL/C 集合变量分配内存。要为 GBase 8s ESQL/C 行变量分配内存,请使用 ALLOCATE ROW 语句。
示例
以下示例显示如何使用 ALLOCATE COLLECTION 语句为未归类的集合变量 a_set 分配资源:
EXEC SQL BEGIN DECLARE SECTION;
client collection a_set; EXEC SQL END DECLARE SECTION;
. . .
EXEC SQL allocate collection :a_set;
以下示例显示如何使用 ALLOCATE COLLECTION 语句为已归类的集合变量 a_typed_set 分配资 源:
EXEC SQL BEGIN DECLARE SECTION;
client collection set(integer not null) a_typed_set;
EXEC SQL END DECLARE SECTION;
. . .
EXEC SQL allocate collection :a_typed_set;
2.2 ALLOCATE DESCRIPTOR 语句
使用 ALLOCATE DESCRIPTOR 语句为系统描述符区域(SDA)声明和分配内存。在 ESQL/C 中 使用此语句。
语法
用法
ALLOCATE DESCRIPTOR 语句创建新的系统描述符区域,该区域是内存中的一个位置,存放 DESCRIBE 语句可以显示的信息,或存放关于查询的 WHERE 子句的信息。
系统描述符区域(SDA)包含一个或多个称为 item descriptors 的字段。每个项描述符都有一个数 据库服务器可以接收或发送的数据值。项描述符也包含关于该数据的信息,例如数据类型、长度、 小数位、精度和可以为 NULL 值。 系统描述符区域存放 DESCRIBE ... USING SQL DESCRIPTOR 语句获取的信息,或者存放关于一 个动态执行语句中的 WHERE 子句的信息。
如果您分配一个系统描述符区域的名称与一个现有系统描述符区域的名称相同,则数据库服务器返 回一条错误消息。如果您使用 DEALLOCATE DESCRIPTOR 语句释放了该描述符,则 ALLOCATE DESCRIPTOR 语句可以重新使用同样的描述符名称。
WITH MAX 子句
您可以使用 WITH MAX 子句标识您需要的项描述符的最大数目。
当您使用此子句时,COUNT 字段设置为您指定的 items 数目。如果您不指定 WITH MAX 子句, COUNT 字段的缺省值为 100 。您可以使用 SET DESCRIPTOR 语句更改 COUNT 字段的值。
ALLOCATE DESCRIPTOR 语句示例
以下示例显示了有效的 ALLOCATE DESCRIPTOR 语句。每个示例都包含 WITH MAX 子句。此示例使 用嵌入的变量名称标识系统描述符区域,并指定所需的项描述符:
EXEC SQL allocate descriptor :descname with max :occ;
下一示例使用加引号的字符串 desc1 作为系统描述符的标识,并且使用无符号整数 3 指定该 desc1 区域中所需的项描述符的最大数目:
EXEC SQL allocate descriptor 'desc1' with max 3;
2.3 ALLOCATE ROW 语句
使用 ALLOCATE ROW 语句为 row 变量分配内存。该语句是 SQL ANSI/ISO 标准的扩展。在 ESQL/C 中使用此语句。 语法
ALLOCATE ROW 语句为存储 row 类型数据的主变量分配内存。要创建 row 变量,ESQL/C 程序必须 执行以下操作:
1. 声明 row 变量。row 变量可以是已归类或未归类的 row 变量。
2. 使用 ALLOCATE ROW 语句为 row 变量分配内存。
以下示例显示如何使用 ALLOCATE ROW 语句为已归类的 row 变量 a_row 分配资源:
EXEC SQL BEGIN DECLARE SECTION;
row (a int, b int) a_row;
EXEC SQL END DECLARE SECTION;
. . .
EXEC SQL allocate row :a_row;
如果内存分配操作成功,则 ALLOCATE ROW 语句会将 SQLCODE (sqlca.sqlcode 的内容)置 零(0);如果分配失败,会将其设置为一个负的错误码。
您必须使用 DEALLOCATE ROW 语句显示地释放内存。一旦您使用 DEALLOCATE ROW 语句释放了该 row 变量,您就可以重新使用该 row 变量。
提示: ALLOCATE ROW 语句仅为 GBase 8s ESQL/C row 变量分配内存。要为 GBase 8s ESQL/C collection 变量分配内存,请使用 ALLOCATE COLLECTION 语句。
当您在多次函数调用中使用同一 row 变量而未对其解除分配时,会导致客户机计算机上的内存泄 露。因为没有办法确定指针在传递时是否是有效的,所以 GBase 8s ESQL/C 会假设它是无效的, 并将其分配到新的内存位置。