返回首页

gbase数据、南大通用产品文档:GBase8s更新游标

更新日期:2024年09月11日

更新游标允许您删除或更新当前行;即,最近访存的行。使用 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 的
数据库时,它可使用任何游标来更新或删除。

SET 数据类型是存储唯一元素的无序集合类型
如 GBase 8s SQL 指南:语法 中所述,重复的元素值无效。(有关支持重复值的集
合类型,请参阅 MULTISET(e) 数据类型中对 MULTISET 的描述。)
可以将相同表的不超过 97 列声明为 SET 数据类型。(同一限制还适用于 MULTISET
和 LIST 集合类型。)
SET 中的元素没有按顺序的位置。也就是说,在 SET 中不存在第一、第二或第三元
素的构造。(有关具有元素的顺序位置的集合类型,请参阅 LIST(e) 数据类型。)SET 中
的所有元素都具有相同的元素类型。要指定元素类型,使用以下语法:
SET(element_type NOT NULL)
集合的 element_type 可以是下列任何类型:
内置类型(SERIAL、SERIAL8、BIGSERIAL、BYTE 和 TEXT 除外)
命名或未命名 ROW 类型
其他集合类型
不透明类型

必须对 SET 元素指定 NOT NULL 约束。对于 SET 列,没有任何其他约束有效。有关

GBase 8s SQL 指南:参考
南大通用数据技术股份有限公司 - 112 -
SET 集合类型语法的更多信息,请参阅 GBase 8s SQL 指南:语法。
除非另有指示,否则可以在使用任何其他数据类型的地方使用 SET。例如:
在用来搜索匹配的 SET 值的 SELECT 语句 WHERE 子句中的 IN 谓词后面
作为用来确定 SET 列中的元素数目的 CARDINALITY 或 mi_collection_card( )
函数的自变量
不能将 SET 值用作聚集函数(例如,AVG、MAX、MIN 或 SUM)的自变量。有关更多
信息,请参阅 GBase 8s SQL 指南:语法 中的 Condition 和 Expression 两节。
下面的示例声明两个集合。第一条语句声明一组整数,第二条语句声明一组字符元
素。
SET(INTEGER NOT NULL)
SET(CHAR(20) NOT NULL)
下面的示例从值列表中构造相同的集合:
SET{1, 5, 13}
SET{"Oakland", "Menlo Park", "Portland", "Lenexa"}
在以下示例中,SET 构造函数是 CREATE TABLE 语句的一部分:
CREATE TABLE tab
(
c CHAR(5),
s SET(INTEGER NOT NULL)
);
下列 set 值相等:
SET{"blue", "green", "yellow"}
SET{"yellow", "blue", "green"}

GLOBAL_LOCKS 视图用于查看各节点各打开事务所持有的锁信息。
名称
类型
描述
node_name
name
数据库进程名称。

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
1070
名称
类型
描述
locktype
text
被锁定对象的类型:relation、extend、page、tuple、tr
ansactionid、virtualxid、object、userlock、advisory。
database
oid
被锁定对象所在数据库的OID:
如果被锁定的对象是共享对象,则OID 为0。
如果是一个事务ID,则为NULL。
relation
oid
关系的OID,如果锁定的对象不是关系,也不是关系
的一部分,则为NULL。
page
integer
关系内部的页面编号,如果对象不是关系页或者不是
行页,则为NULL。
tuple
smallint
页面里边的行编号,如果对象不是行,则为NULL。
virtualxid
text
事务的虚拟ID,
如果对象不是一个虚拟事务ID,
则为
NULL。
transactionid
xid
事务的ID,如果对象不是一个事务ID,则为NULL。
classid
oid
包含该对象的系统表的OID,如果对象不是普通的数
据库对象,则为NULL。
objid
oid
对象在其系统表内的OID,如果对象不是普通数据库
对象,则为NULL。
objsubid
smallint
对于表的一个字段,这是字段编号;对于其他对象类
型,这个字段是零;如果这个对象不是普通数据库对
象,则为NULL。
virtualtransaction
text
持有此锁或者在等待此锁的事务的虚拟ID。
pid
bigint
持有或者等待这个锁的服务器线程的逻辑ID。如果锁
是被一个预备事务持有的,则为NULL。
mode
text
这个线程持有的或者是期望的锁模式。
granted
boolean
如果锁是持有锁,则为TRUE。
如果锁是等待锁,则为FALSE。
fastpath
boolean
如果通过fast-path 获得锁,则为TRUE;如果通过主
要的锁表获得,则为FALSE。

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
1071