为表声明别名
可以为表声明别名。别名可以引用本地或远程表、视图或同义词的完全限定数据库对象名称。
别名是未在数据库的系统目录中注册临时的名称,而且只有在 DELETE 语句运行时才会保留。
如果您声明为别名的名称是关键字 WHERE,则必须使用 AS 关键字来说明语法:
DELETE stock AS where WHERE manu_code = (SELECT manu_code FROM where WHERE manu_code MATCHES 'H*');
因为 where 是 DELETE 和 SELECT 的关键字,所以之前的示例不易读取。以下示例访问远程表而 不声明表的别名:
DELETE overstock@cleveland:stock AS ocs WHERE manu_code = (SELECT manu_code FROM overstock@cleveland:stock WHERE manu_code MATCHES 'H*'); ;
下一个示例在逻辑上等同于前一个 DELETE 语句,但通过将 ocs 声明为引用子查询中的相同表的 别名来简化符号:
DELETE overstock@cleveland:stock AS ocs WHERE manu_code = (SELECT manu_code FROM ocs WHERE manu_code MATCHES 'H*');
使用 WHERE CURRENT OF 关键字(ESQL/C, SPL)
WHERE CURRENT OF 子句删除一个游标的活动集合的当前行。当包括这个子句时,DELETE 语 句会在游标的当前位置处除去活动集合的行。在删除之后,没有任何当前的行存在;您无法使用游 标删除或更新行,直到您使用 FETCH 语句(ESQL/C 例程中)或 FOREACH 语句( SPL 例程 中)重新确定游标的位置。
你可以使用更新游标来访问游标的活动集合的当前行。在可以使用 WHERE CURRENT OF 子句之 前,您必须通过使用 FOREACH 语句(SPL 中)或使用带 FOR UPDATE 子句( GBase 8s ESQL/C 中)的 DECLARE 语句。跟在 OF 关键字之后的 cursor_id 不能通过 SPL 例程中的 DECLARE 声明。
除非使用 FOR READ ONLY 关键字声明所有 Select 游标,否则所有 Select 游标在兼容 ANSI 的 数据库中均是潜在的更新游标。您可以将 WHERE CURRENT OF 子句与没有用 FOR READ ONLY 关键字声明的任何 Select 游标一起使用。
如果您只从表层次结构中的一个表进行选择,则不可以使用 WHERE CURRENT OF 。即这个子句 对 ONLY 关键字无效。
通过删除集合变量控制的集合派生的表的当前行,WHERE CURRENT OF 子句可用于从集合删除 元素。有关更多信息,请参阅集合派生表。
删除包含不透明数据类型的行
当删除一些不透明数据类型的时,它们需要特别的处理过程。例如,如果不透明数据类型包含占数 据库空间的或多重表示的数据,则它可能提供如何存储该数据的选项:在内部结构中或者在智能大 对象中(对于大对象)。
要完成此进程,应调用一个称为 destroy( ) 的用户定义的支持函数。当使用 DELETE 除去包含这 些不透明数据类型的其中一种的行的时,数据库服务器会自动对该不透明数据类型调用
destroy( ) 。此函数决定如何除去数据,不管它存储在什么地方。有关对 destroy( ) 支持函数的更 多信息,请参阅 GBase 8s 用户定义的例程和数据类型开发者指南 。
删除包含集合数据类型的行
当行包含集合数据类型的列(LIST 、MULTISET 或 SET),您可以在集合中搜寻特定的元素,并 且删除在其中发现该元素的一行或多行。
例如,以下的示例从 new_tab 表中删除其中的 set_col 列包含元素 jimmy smith 的任何行:
DELETE FROM new_tab WHERE 'jimmy smith' IN set_col;
您也可以通过删除集合中一个或多个个别元素使用集合变量删除集合列中的值。有关更多信息,请 参阅 集合派生表 和 数据库名 和 从集合中执行删除操作的示例 中的示例。




