-
- DATABASE 语句
使用 DATABASE 语句可打开一个能访问的数据库作为当前数据库。该语句是 SQL ANSI/ISO 标准的扩展。
语法
元素 | 描述 | 限制 | 语法 |
database | 数据库的名称 | 数据库必须存在 | 数据库名 |
用法
您可以使用 DATABASE 语句选择数据库服务器上的任何数据库。要选择另一台数据库服务器上的数据库,应指定数据库服务器的名称及数据库名。
如果用数据库名称包括当前(或另一个)数据库服务器的名称,则数据库服务器名称不可以大写。(有关指定数据库服务器名称的语法,请参阅数据库名。)
当数据库已打开时,发出 DATABASE 语句会在打开的新的数据库之前关闭当前的数据库。关闭当前数据库会释放数据库服务器的所有游标资源,使所有已声明至该点的游标无效。如果通过 SET SESSION AUTHORIZATION 语句更改了 user 规范,则在打开新数据库使会恢复原始的用户名。
如果先前的 CONNECT 语句已经和数据库建立了一个显式连接,而且该连接仍然是当前连接,那么在使用 DISCONNECT 语句关闭该显式连接之前,不能使用 DATABASE 语句(或任何创建隐式连接的语句)。
当前用户(或 PUBLIC)必须拥有对 DATABASE 语句中指定的数据库的“连接”特权。当前用户不可以拥有同数据库中现有角色相同的用户名。
DATABASE 语句在多语句 PREPARE 操作中是一个无效语句。
DATABASE 执行之后立即设置 SQLCA.SQLWARN (ESQL/C)
在 DATABASE 执行之后,您可以立即通过检查 sqlca 结构中的警告标志标识指定数据库的特征。
- 如果 sqlca.sqlwarn 的第一个字段为空白,则不发出任何警告。
- 如果被打开的数据库支持事务日志记录,则第二个 sqlca.sqlwarn 字段设置为字母 W。
- 如果数据库是一个兼容 ANSI 的数据库,则第三个字段设置为 W 。
- 如果数据库是 GBase 8s 数据库,则第四个字段设置为 W 。
- 如果数据库将所有的浮点数据转换成 DECIMAL 格式,则第五个字段设置为 W。(系统缺少 FLOAT 和 SMALLFLOAT 支持。)
- 如果数据库是数据复制对中的次触发器(即在只读方式下运行),则第七个字段设置为 W。
- 如果数据库将 DB_LOCALE 设置为一个不同于客户机系统上 DB_LOCALE 设置的语言环境,则第八个字段设置为 W 。
EXCLUSIVE 关键字
EXCLUSIVE 关键字以互斥方式打开数据库,并防止除当前用户之外的任何人访问。要允许其他人访问数据库,您必须先执行 CLOSE DATABASE 语句,然后在不带 EXCLUSIVE 关键字的情况下重新打开数据库。
以下语句以互斥方式打开 training 数据库服务器上的 stores_demo 数据库:
DATABASE stores_demo@training EXCLUSIVE;
如果另一个用户已打开指定的数据库,则拒绝互斥访问并返回一个错误,而且不打开任何数据库。
如果您遇到该错误,但是您无法确认是否有其它用户连接了此数据库,则在 Scheduler API 上运行由传感器或任务导致的非互斥访问。要暂时禁止此 Scheduler,您可以发出此 SQL 管理 API 命令:
EXECUTE FUNCTION admin('scheduler shutdown');
admin('scheduler shutdown') 例程执行完毕后,重新尝试 DATABASE ... EXCLUSIVE 语句。
有关 Scheduler API 命令的更多信息,请参阅 GBase 8s 管理员指南。有关调用 SQL 管理 API 函数必须持有的权限的信息,请参阅 GBase 8s 管理员参考手册。
-
- DEALLOCATE COLLECTION 语句
使用 DEALLOCATE COLLECTION 语句释放先前通过 ALLOCATE COLLECTION 语句分配的集合变量的内存。
该语句是 SQL ANSI/ISO 标准的扩展。在 ESQL/C 中使用此语句。
语法
元素 | 描述 | 限制 | 语法 |
variable | 标识要解除为其分配的内存的已归类的或未归类的集合变量的名称 | 必须是已分配的 GBase 8s ESQL/C 集合变量的名称 | 名称必须符合针对变量名称制定的语言特定规则 |
用法
DEALLOCATE COLLECTION 语句释放与 variable 标识的 GBase 8s ESQL/C 集合变量相关联的所有内存。您必须使用 DEALLOCATE COLLECTION 显式地释放集合变量的内存资源。否则,解除分配会在程序结束时自动发生。
DEALLOCATE COLLECTION 语句会释放已归类的和未归类的集合变量的资源。
提示: DEALLOCATE COLLECTION 语句只解除为 GBase 8s ESQL/C 集合变量分配的内存。要解除为 GBase 8s ESQL/C 行变量分配的内存,应使用 DEALLOCATE ROW 语句。
如果要解除分配一个不存在的集合变量或不是 GBase 8s ESQL/C 集合变量的变量,会导致错误。一旦解除分配一个集合变量,即可使用 ALLOCATE COLLECTION 来重新分配资源,然后重新使用一个集合变量。
此示例显示了如何使用 DEALLOCATE COLLECTION 语句解除分配给未归类的集合变量 a_set 的资源:
EXEC SQL BEGIN DECLARE SECTION;
client collection a_set;
EXEC SQL END DECLARE SECTION;
. . .
EXEC SQL allocate collection :a_set;
. . .
EXEC SQL deallocate collection :a_set;
相关示例,请参阅相关的概念,插入集合游标。