南大通用GBase8s 常用SQL语句(138)

为更新而访存行

FETCH 语句通常不锁定已访存的行。这样,您的程序收到该访存的行之后,另一进程可立即修改(更新或删除)它。在下列情况下,锁定访存的行:

  1. 在您将隔离级别设置为 Repeatable Read 时,以读锁锁定访存的每一行,直到当前会话结束为止。其他程序还可读锁定的行。
  2. 在您将隔离级别设置为 Cursor Stability 时,锁定当前行。
  3. 在符合 ANSI 的数据库中,Repeatable Read 为缺省的隔离级别;您可将它设置为其他值。
  4. 当您通过更新游标(声明 FOR UPDATE 的游标)访存时,以可提升锁锁定访存的每一行。其他程序可读取锁定的行,但其他程序不可放置可提升锁或写锁;因此,如果另一用户试图使用 UPDATE 或 DELETE 语句的 WHERE CURRENT OF 子句修改该行,则它保持不变。

当您修改行时,锁升级为写锁并保持直到游标关闭或事务结束为止。如果您不修改行,则数据库服务器的行为取决于已设置的隔离级别。一旦访存另一行,数据库服务器即释放未更改的行的锁,除非您正在使用 Repeatable Read 隔离。(请参阅 SET ISOLATION 语句。)

重要: 在没有使用 Repeatable Read 隔离或 Repeatable Read 隔离不可用时,您可在附加的行上保持锁定。当您的程序正在读其他行时,以未更改的数据更新该行来保持对它的锁定。您必须在应用的上下文中评估此技术对性能的影响,且必须了解增加死锁的可能。

在您使用显式事务时,请确保在单个事务内既访存也修改行;即,FETCH 和后续的 UPDATE 或 DELETE 语句都必须在 BEGIN WORK 语句与下一个 COMMIT WORK 语句之间。

从集合游标访存

集合游标允许您访问 GBase 8s ESQL/C 集合变量的个别元素。要声明集合游标,请使用 DECLARE 语句,并将集合派生表段包括在与游标关联的 SELECT 语句中。在您以 OPEN 语句打开集合游标之后,该游标允许您来访问集合变量的元素。

要从集合游标每次访存一个元素,请使用 FETCH 语句和 INTO 子句。FETCH 语句标识以集合变量关联的集合游标。INTO 子句标识保留从集合游标访存的元素值的主变量。INTO 子句中的主变量的数据类型必须与集合的元素类型相配。

假设您有一名为 children 的表,具有下列结构:

CREATE TABLE children

(

   age         SMALLINT,

   name         VARCHAR(30),

   fav_colors            SET(VARCHAR(20) NOT NULL),

)

下列 GBase 8s ESQL/C 代码段展示如何从 child_colors 集合变量访存元素:

EXEC SQL BEGIN DECLARE SECTION;

   client collection child_colors;

   varchar one_favorite[21];

   char child_name[31] = "marybeth";

EXEC SQL END DECLARE SECTION;

EXEC SQL allocate collection :child_colors;

/* Get structure of fav_colors column for untyped

 * child_colors collection variable */

EXEC SQL select fav_colors into :child_colors

   from children

   where name = :child_name;

/* Declare select cursor for child_colors collection

 * variable */

EXEC SQL declare colors_curs cursor for

   select * from table(:child_colors);

EXEC SQL open colors_curs;

do

{

   EXEC SQL fetch colors_curs into :one_favorite;

   ...

} while (SQLCODE == 0)

EXEC SQL close colors_curs;

EXEC SQL free colors_curs;

EXEC SQL deallocate collection :child_colors;

在访存集合元素之后,您可以 UPDATA 或 DELETE 语句修改该元素。要获取更多信息,请参阅本文档中的 UPDATE 和 DELETE 语句。您还可以 INSERT 语句将新元素插入到集合变量内。要获取更多信息,请参阅 INSERT 语句。

检查 FETCH 的结果

您可使用 SQLSTATE 变量来检查每一 FETCH 语句的结果。数据库服务器在每一 SQL 语句之后设置 SQLSTATE 变量。如果成功地返回一行,则 SQLSTATE 变量包含值 00000。如果未找到行,则数据库服务器设置 SQLSTATE 代码为 02000,表明 未找到数据,且当前行不变。下列条件将 SQLSTATE 代码设置为 02000,表明 未找到数据:

  1. 活动的集合未包含行。
  2. 在游标指向活动的集合中的最后一行或越过该行时,发出 FETCH NEXT 语句。
  3. 在游标指向活动的集合中的第一行时,发出 FETCH PRIOR 或 FETCH PREVIOUS 语句。
  4. 在活动的集合中不存在第 n 行时,发出 FETCH RELATIVE n 语句。
  5. 在活动的集合中不存在第 n 行时,发出 FETCH ABSOLUTE n 语句。

数据库服务器从系统诊断区域的 RETURNED_SQLSTATE 域复制 SQLSTATE 代码。 GBase 8s 的客户机/服务器通信协议,诸如 SQLI 和 DRDA®,支持 SQLSTATE 代码值。要获取这些代码的列表,并获取关于如何获得消息文本的消息,请参阅 使用 SQLSTATE 错误状态代码。您可使用 GET DIAGNOSTICS 语句来直接地检验 RETURNED_SQLSTATE 域。系统诊断区域还可包含附加的错误信息。

您还可使用 SQL 通信区域(sqlca)的 SQLCODE 变量来确定相同的结果。

 SPL 例程中的使用 FETCH

使用 SPL 例程中的 FETCH 语句来检索指定的动态游标活动的集合的下一行,检索到一个在同一 SPL 例程中声明的 SPL 变量的有序列表内。

语法

SPL 例程中 FETCH 语句的语法是在 GBase 8s ESQL/C 例程中 FETCH 支持的语法的子集。

 

元素

描述

限制

语法

cursor_id

动态游标的名称

必须是打开的且已经在同一 SPL 例程中声明

标识符

output_var

存储来自该行的访存的值的 SPL 变量

必须在调用上下文中已经本地地或全局地声明,且必须为与访存的列值相兼容的数据类型

标识符

cursor_var

游标变量的名称

必须已经定义并打开

标识符

恰如在 ESQL/C 例程中那样,输出变量的列表必须与列值的数量、顺序和数据类型相一致,这些列值是 SQL 语句关联的由特定的游标返回的那些行。

所有 SPL 游标都是顺序游标。您的 UDR 必须包括检测游标的活动的集合到头的逻辑,因为在 SPL 中 NOTFOUND 条件不会自动地产生例外。

内建的 SQLCODE 函数,仅可从 SPL 例程调用的函数,可返回 FETCH 操作的状态代码。

对引用顺序选择游标或功能游标的 FETCH 语句的其他 ESQL/C 限制,也适用于 SPL 中的 FETCH 操作。

SPL 例程中的 FETCH 语句不支持下列 ESQL/C 特性:

  1. 位置规范或位置关键字(需要滚动游标)
  2. 随同描述符或随同 sqlda 指针的 USING 子句。

在 SPL 语言中,不需要指示符变量。如果 FETCH 操作收到 NULL 值,则将收到访存的值的 SPL 变量设置为 NULL。

FETCH 语句仅可引用 DECLARE 语句定义的动态游标和 DEFINE 语句定义的游标变量。cursor_id 不可指定 SPL 的 FOREACH 语句声明的直接游标的名称。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值