返回首页

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 的
数据库时,它可使用任何游标来更新或删除。

游标的操作类似将每行的值取出来,做一系列处理。如果可以去掉游标,改成一
条包含多个相关子查询的SQL,性能将大大提升。

DMY2-
08-01-11
MDY20
010811
MDY4
01/08/2011
Y4MD*
2011/01/08

格式 Y4MD*(因为星号不是有效分隔符)和 MDY4(未定义任何分隔符)都会显示缺省
符号(斜杠)作为分隔符。

GBase 8s SQL 指南:参考
南大通用数据技术股份有限公司 - 151 -

要点: 如果使用 Y2 格式,那么 DBCENTURY 环境变量的设置还会影响在数据输入时
对文字 DATE 值求值的方式。
另外,GBase 8s ESQL/C 调用的某些例程可使用 DBTIME 变量(而不是 DBDATE)
来将 DATETIME 格式设置为国际规范。有关更多信息,请参阅 DBTIME 环境变量和
GBase 8s ESQL/C 程序员手册 中对 DBTIME 环境变量的论述。
DBDATE 变量的设置优先于 GL_DATE 环境变量的设置,并且优先于
CLIENT_LOCALE 指定的任何缺省 DATE 格式。有关 GL_DATE 和
CLIENT_LOCALE 的信息,请参阅《GBase 8s GLS 用户指南》。
最终用户格式影响下列上下文:
l
在显示 DATE 值时,GBase 8s 产品使用 DBDATE 环境变量来确定输出的格式。
l
在 DATE 值的数据输入期间,GBase 8s 产品使用 DBDATE 环境变量来解释输入。
例如,如果在 INSERT 语句中指定文字 DATE 值,那么数据库服务器期望此文字值
与 DBDATE 指定的格式兼容。同样,数据库服务器将您指定为 DATE( ) 函数的自变量
的日期解释为 DBDATE 格式。
数据库对象中的 DATE 表达式
当数据库对象中的表达式
(包括检查约束、
分段存储表达式、
SPL 例程、
触发器或 UDR)
包含字面日期值时,数据库服务器使用在创建(或上次修改)数据库对象时 DBDATE(或其
他相关环境变量)所具有的设置对表达式求值。如果 DBDATE 已复位为新值,那么对文字
DATE 求值时会忽略该新值。
例如:假如 DBDATE 设置为 MDY2/,用户创建了一个表且 orderdate 列具有以下检查
约束:
orderdate < '06/25/98'
则先前表达式的日期根据定义约束时 DBDATE 的值来进行格式编排。检查约束表达
式解释为 orderdate < '06/25/98',不管对 orderdate 列执行插入或更新操作期间
DBDATE 的值如何。假设当用户将值 '30/01/98' 插入 orderdate 列中时,DBDATE
复位为 DMY2/。插入的日期值使用日期格式 DMY2/,而检查约束表达式使用日期格式
MDY2/。
有关较早版本的 GBase 8s 中始终根据运行时环境求值的旧对象的讨论,请参阅数据
库对象中的缩写年份和表达式。该节描述如何重新定义对象,以便根据定义对象(或上次
修改对象)时生效的环境变量设置解释日期。
要点: GBase 8s 的 DBDATE 的行为与先前版本不兼容。