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

为更新而访存行
FETCH 语句通常不锁定已访存的行。这样,您的程序收到该访存的行之后,另一进程可立即修改(更新或删除)它。在下列情况下,锁定访存的行:
在您将隔离级别设置为 Repeatable Read 时,以读锁锁定访存的每一行,直到当前会话结束为止。其他程序还可读锁定的行。
在您将隔离级别设置为 Cursor Stability 时,锁定当前行。
在符合 ANSI 的数据库中,Repeatable Read 为缺省的隔离级别;您可将它设置为其他值。
当您通过更新游标(声明 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,表明 未找到数据:
    活动的集合未包含行。
    在游标指向活动的集合中的最后一行或越过该行时,发出 FETCH NEXT 语句。
    在游标指向活动的集合中的第一行时,发出 FETCH PRIOR 或 FETCH PREVIOUS 语句。
    在活动的集合中不存在第 n 行时,发出 FETCH RELATIVE n 语句。
    在活动的集合中不存在第 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 特性:
位置规范或位置关键字(需要滚动游标)
随同描述符或随同 sqlda 指针的 USING 子句。
在 SPL 语言中,不需要指示符变量。如果 FETCH 操作收到 NULL 值,则将收到访存的值的 SPL 变量设置为 NULL。
FETCH 语句仅可引用 DECLARE 语句定义的动态游标和 DEFINE 语句定义的游标变量。cursor_id 不可指定 SPL 的 FOREACH 语句声明的直接游标的名称。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值