返回首页

gbase数据、南大通用产品文档:GBase8s直接删除

更新日期:2024年09月11日

您可在程序中嵌入 DELETE 语句。下列示例使用 GBase 8s ESQL/C:
EXEC SQL delete from items
WHERE order_num = :onum;
您还可动态地准备和执行同样形式的语句。在任一情况下,该语句直接作用于数据库来影
响一行或多行。
示例中的 WHERE 子句使用名为 onum 的主变量的值。通常在该操作之后,将结果发布在
SQLSTATE 中以及在 sqlca 结构中。即使发生错误,SQLERRD 数组的第三个元素也包含
删除的行的计数。SQLCODE 中的值展示操作的完全成功。如果该值不是负的,则未发生
错误且 SQLERRD 的第三个元素是满足了 WHERE 子句并被删除了的所有行的计数。

直接删除期间的错误
当发生错误时,
该语句提前终止。
SQLSTATE 中的值和 SQLCODE 中的值以及 SQLERRD
的第二个元素说明它的原因,且行的计数显示删除了的行数。对于许多错误,由于错误阻
止数据库服务器开始操作,因此那个计数为零。例如,如果不存在命名的表,或如果重命
名 WHERE 子句中测试的列,则不会尝试任何删除。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 231 -
然而,在操作开始且处理某些行之后,可发现某些错误。这些错误中最常见的是锁冲突。
在数据库服务器可删除那行之前,它必须获取行上的排他锁。其他程序可能正在使用来自
该表的行,阻止该数据库服务器锁定行。由于锁定的问题影响所有类型的修改,因此在 对
多用户环境编程 中讨论它。
另外,
在删除开始之后,
可出现较少见的错误类型。
例如,
在更新数据库时发生硬件错误。

事务日志记录
在修改期间为任何种类的错误做准备的最好方式是使用事务日志记录。万一发生错误,您
可告诉数据库服务器将数据库恢复原样。下列示例是基于直接删除 部分中的示例的,将其
扩展为使用事务:
EXEC SQL begin work; /* 开启事务 */
EXEC SQL delete from items
where order_num = :onum;
del_result = sqlca.sqlcode; /* 保存两个错误 */
del_isamno = sqlca.sqlerrd[1]; /* 代码编号 */
del_rowcnt = sqlca.sqlerrd[2]; /* 以及行的计数 */
if (del_result < 0) /* 发现的问题:*/
EXEC SQL rollback work; /* 恢复一切 */
else /* 一切正常:*/
EXEC SQL commit work; /* 结束事务 */
此示例中的关键在于,在程序结束该事务之前,它将重要的返回值保存在 sqlca 结构中。像
其他 SQL 语句一样,ROLLBACK WORK 和 COMMIT WORK 语句都在 sqlca 结构中设
置返回代码。
然而,
如果您想要报告错误生成的代码,
则必须在执行 ROLLBACK WORK 之
前保存它们。ROLLBACK WORK 语句移除所有暂挂的事务,包括它的错误代码。
使用事务的优势在于,不管发生什么错误,数据库都处于已知的、可预测的状态。不存在
修改完成了多少的问题;要不就是都完成了,要不就是都没完成。
在带有日志记录的数据库中,如果用户未启动一个显式的事务,则数据库服务器在语句执
行之前初始化一个内部的事务,并在执行完成或失败后终止该事务。如果语句执行成功,
则提交该内部的事务。如果语句失败,则回滚该内部的事务。

协调的删除
当您必须修改多个表时,事务日志记录的用处特别明显。例如,考虑从演示数据库删除一
个订单的问题。在该问题的最简单的形式中,您必须从两个表 orders 和 items 同时删除行,
如下列 GBase 8s ESQL/C 的示例所示:
EXEC SQL BEGIN WORK;

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 232 -
EXEC SQL DELETE FROM items
WHERE order_num = :o_num;
if (SQLCODE >= 0)
{
EXEC SQL DELETE FROM orders
WHERE order_num == :o_num;
{
if (SQLCODE >= 0)
EXEC SQL COMMIT WORK;
{
else
{
printf("Error %d on DELETE", SQLCODE);
EXEC SQL ROLLBACK WORK;
}
不论是否使用事务,此程序的逻辑都很相似。如果未使用它们,则看到错误消息的人员更
难作出决定。依赖于错误发生的时间,下列情况中的一种适用:

未执行删除;此订单的所有行都保留在数据库中。

删除了某些商品行,但不是全部;仅保留某些商品的订单记录。

删除了所有商品行,但保留订单行。

删除了所有行。
在第二种和第三种情况下,数据库受到一定程度的损害;它包含可导致某些查询产生错误
结果的部分信息。您必须小心行事来恢复信息的一致性。当使用事务时,会防止所有这些
不确定性。

可以使用 onspaces -r 选项结束 dbspace 、blobspace 或 sbspace 的镜像。
语法:

该命令有等同的 SQL 管理 API 命令。
元素
用途
关键注意事项
-r
向数据库服务器指示现有的
dbspace 、 blobspace 或
sbspace 的镜像应结束
有关背景信息,
请参阅 GBase
8s 管理员指南 中
的 使用镜像 一章
-y
导致数据库服务器自动对所
有提示响应“是”

blobspace 给出您想要结束镜像的
blobspace 的名称
语法必须符合 Identifier 段;请参阅 《GBase
8s SQL 指南:语法》。有关更多信息,请参阅
GBase 8s 管理员指南 中的 使用镜像 一章
dbspace
给出您想要结束镜像的
dbspace 的名称
语法必须符合 Identifier 段;请参阅 《GBase
8s SQL 指南:语法》。有关更多信息,请参阅
GBase 8s 管理员指南 中的 使用镜像 一章
sbspace
给出您想要结束镜像的
sbspace 的名称
语法必须符合 Identifier 段;请参阅 《GBase
8s SQL 指南:语法》。有关背景信息,请参阅
GBase 8s 管理员指南 中的 使用镜像 一章

功能说明
数据库限表,给出了有关数据库权限的信息。
表结构说明
表5- 233 表结构信息说明:




GRANTEE
权限所有者
TABLE_CATALOG
表登记目录
TABLE_VC
所属VC
TABLE_SCHEMA
所属数据库
PRIVILEGE_TYPE
权限类型
IS_GRANTABLE
是否具有赋予权限的权限