更新游标允许您删除或更新当前行;即,最近访存的行。使用 GBase 8s ESQL/C 编写的下
列示例展示更新游标的声明:
EXEC SQL
DECLARE names CURSOR FOR
SELECT fname, lname, company
FROM customer
FOR UPDATE;
使用此游标的程序可以常规的方法访存行。
EXEC SQL
FETCH names INTO :FNAME, :LNAME, :COMPANY;
如果该程序然后决定需要修改该行,则它可这么做。
if (strcmp(COMPANY, "SONY") ==0)
{
EXEC SQL
UPDATE customer
SET fname = 'Midori', lname = 'Tokugawa'
WHERE CURRENT OF names;
}
关键字 CURRENT OF names 替代 WHERE 子句中的常规测试表达式。在其他方面,
UPDATE 语句保持不变,
即使包括表名称的规范,
在游标名称中其为隐式的,
但仍然需要。
关键字 UPDATE 的用途
游标中的关键字 UPDATE 的用途是让数据库服务器可更新(或删除)它访存的任何行。
数据库服务器在通过更新游标访存的行上放置较多的需求锁,而当它访存未使用那个关键
字声明的游标的行时,放置较少的需求锁。此操作使常规的游标有较好的性能,以及在多
处理系统中更高的并发使用级别。(对多用户环境编程 讨论锁和并发使用的级别。)
GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 240 -
更新特定的列
下列示例已更新了前面的更新游标示例的特定的列:
EXEC SQL
DECLARE names CURSOR FOR
SELECT fname, lname, company, phone
INTO :FNAME,:LNAME,:COMPANY,:PHONE FROM customer
FOR UPDATE OF fname, lname
END-EXEC.
仅可通过此游标更新 fname 和 lname 列。作为错误拒绝如下语句:
EXEC SQL
UPDATE customer
SET company = 'Siemens'
WHERE CURRENT OF names
END-EXEC.
如果程序尝试这样的更新,则返回错误代码且不发生更新。由于删除影响所有列,因此,
也拒绝使用 WHERE CURRENT OF 的删除尝试。
不总是需要的 UPDATE 关键字
SQL 的 ANSI 标准不提供游标定义中的 FOR UPDATE 子句。当程序使用符合 ANSI 的
数据库时,它可使用任何游标来更新或删除。