本章描述了原因GBase8s识别的SQL语句的语法和定义。
这些SQL按字母顺序显示句子描述。
对某些句子,重要的语义详细信息显示在本文档的其他卷中,如交叉引用所指出。
许多句子、语法图和/或紧跟语法图后的项表,包括了对数据类型和表达式或其它语法段中引用语法段。
当SQL语句的名称包括小写字符(如“SETDatabaseObjectMode”)时间。表示语句名称中的第一个混合大小写的字符串不是SQL关键字代表两个或两个以上的不同SQL关键字可以跟在前面大写关键词后面。
请参考句子描述的结构描述SQL语法概述。
使用ALLOCATECOLLECTION语句是集合数据类型的变量(例如LIST、MULTISET或SET)或未归类的集合变量分配内存。
语法
元素 |
描述 |
限制 |
语法 |
variable |
要分配的已归类的或 未归类的集合变量的 名称 |
必须为未分配的 GBase 8s ESQL/C 集合类型主变量 |
特定于语言 的名称规则 |
用法
该语句是 SQL ANSI/ISO 标准的扩展。在 ESQL/C 中使用此语句。
ALLOCATE COLLECTION 语句为可以存储 collection 数据类型的值的 ESQL/C 变量分配内存。
要为 GBase 8s ESQL/C 程序创建集合变量:
1. 在 GBase 8s ESQL/C 程序中作为客户机集合变量声明集合变量。 集合变量可以是已归类或未归类的集合变量。
2. 使用 ALLOCATE COLLECTION 语句为集合变量分配内存。
如果分配内存成功, ALLOCATE COLLECTION 语句会将 (也就是
零(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;
使用 ALLOCATE DESCRIPTOR 语句为系统描述符区域(SDA)声明和分配内存。在 ESQL/C 中 使用此语句。
语法
元素 |
描述 |
限制 |
语法 |
descriptor |
未分配的系统描述符 区域的名称 |
包含在单引号 ( ' ) 中。在 SDA 名称中必 须是唯一的 |
引用字符 串. |
descriptor_var |
用来存储系统描述符 区域名称的主机变量 |
必须包含未分配系统 描述符区域的名称 |
特定于语 言 |
items |
descriptor 中项描述 符的数目。缺省值为 100 。 |
必须是大于零的无符 号 INTEGER |
精确数值 |
items_var |
包含项目数目的主变 量 |
数据类型必须为 INTEGER 或 SMALLINT |
特定于语 言 |
用法
ALLOCATE DESCRIPTOR 语句创建新的系统描述符区域,该区域是内存中的一个位置, 存放 DESCRIBE 语句可以显示的信息,或存放关于查询的 WHERE 子句的信息。
系统描述符区域(SDA)包含一个或多个称为 itemdescriptors 的字段。每个项描述符都有一个数 据库服务器可以接收或发送的数据值。项描述符也包含关于该数据的信息, 例如数据类型、长度、 小数位、精度和可以为 NULL 值。
系统描述符区域存放 DESCRIBE ... USING SQL DESCRIPTOR 语句获取的信息,或者存放关于一 个动态执行语句中的 WHERE 子句的信息。
如果您分配一个系统描述符区域的名称与一个现有系统描述符区域的名称相同,则数据库服务器返 回一条错误消息。如果您使用 DEALLOCATE DESCRIPTOR 语句释放了该描述符,则 ALLOCATE DESCRIPTOR 语句可以重新使用同样的描述符名称。
您可以使用 WITH MAX 子句标识您需要的项描述符的最大数目。
当您使用此子句时, 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;
使用 ALLOCATE ROW 语句为 row 变量分配内存。该语句是 SQL ANSI/ISO 标准的扩展。在 ESQL/C 中使用此语句。
语法
元素 |
描述 |
限制 |
语法 |
variable |
要分配的已归类或未 归类的 row变量名称 |
必须为未分配的 GBase 8s ESQL/C row 类型主变量 |
特定于 语言 |
用法
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 语句会将
零(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 会假设它是无效的, 并将其分配到新的内存位置。
可以使用 ALTER ACCESS_METHOD 语句更改一个或多个
语法
元素 |
描述 |
限制 |
语法 |
access_method |
要更改的 存取方法 的名称 |
存取方法必须由先前的 CREATE ACCESS_METHOD 语句 在 sysams 系统目录表中注 册 |
标识符 |
owner |
存取方法 所有者的 名称 |
必须拥有该存取方法 |
所有者名称 |
purpose _keyword |
表示要更 改的特征 的关键字 |
关键字必须通过先前的 CREATE 或 ALTER |
用途函数、标 志和值 |
元素 |
描述 |
限制 |
语法 |
ACCESS_METHOD 语句和存取 方法相关联 |
用法
该语句是 SQL ANSI/ISO 标准的扩展。该语句无法修改内置的存取方法。
使用 ALTER ACCESS_METHOD 更改用户定义存取方法的定义。您无法修改内置的存取方法。
您必须是该存取方法的所有者或具有修改用户定义存取方法的 DBA 特权。在符合 ANSI 的数据 库中, 如果另一个用户是该存取方法的所有者,那么 DBA 必须限定该存取方法的名称。
当更改存取方法时, 您同时更改了定义该存取方法的目的选项规范(目的函数、目的标志或目的 值)。例如,您可以更改一个存取方法以分配一个新的用户定义的函数或方法名称,或为一个表的 扫描成本提供乘数。
如果事务正在处理中,则数据库服务器将等待修改存取方法, 直接提交或回滚该事务。该事务完成 之前, 其他任何用户都无法执行该存取方法。
示例
以下语句更改了 remote 用户定义的存取方法:
ALTER ACCESS_METHOD remote
ADD am_scancost = FS_scancost,
ADD am_rowids,
DROP am_getbyid,
MODIFY am_costfactor = 0.9;
上述示例将对该存取方法进行以下修改:
⚫ 添加一个称为
⚫ 设置(添加)
⚫ 删除与
• 修改
可以使用 ALTER FRAGMENT 语句更改现有表或索引的分布策略或存储位置。该语句是 SQL ANSI/ISO 标准的扩展。
语法
元素 |
描述 |
限制 |
语法 |
surviving _index |
用于修改分布或存储 的索引 |
当该语句执行时必须存在 |
标识符 |
surviving _table |
用于修改分布或存储 的表 |
必须存在。请参阅 对 ALTER FRAGMENT 语句的限制 |
标识符 |
用法
ALTER FRAGMENT 语句仅适用于位于当前站点的表分片或索引分片。不会存储或更新任何远程 信息。
要更改一个表的分片存储策略, 您必须具有 Alter 或 DBA 特权。要更改一个索引的分段存储策 略,您必须具有 Index 或 DBA 特权。
Attention: 此语句可能导致索引被删除或重建。执行更改操作之前, 请仔细阅读 GBase 8s 性能
指南 中的相应章节以查看影响和策略。
ALTER FRAGMENT 语句的子句支持以下任务。
子句 作用
ATTACH 将两个或多个具有相同模式的表组合到一个分片表中
DETACH 将一个表分片从分片存储策略中拆离, 并将其置于一个新表中
INIT 提供以下选项:
• 定义并初始化一个表上的分片存储策略
• 更改对分片表达式求值的顺序
• 更改表或索引的分片存储策略
• 更改现有表的存储位置
• 将数据从现有的表分片移到另一个新的分片表中
• 更改数据库给表或索引生成的分片存储位置
• 更改表或索引的分片键或分片表达式
ADD 将另一个分片添加到一个现有分片存储列表