open

EGL open 语句从关系数据库中选择一组行,以供 get next 语句以后检索。open 语句可以对游标或对被调用过程执行操作。


不带 SQL 记录的 open 语句的语法图

带有 SQL 记录的 open 语句的语法图
resultSetID
一个标识,它使 open 语句与以后的 get nextreplacedeleteclose 语句相关。有关详细信息,请参阅 resultSetID
scroll
允许您在结果集中以各种方式移动的选项。语句 get next 总是可用的,但使用 scroll 还允许您使用下列语句:
  • get absolute
  • get current
  • get first
  • get last
  • get previous
  • get relative
hold
发生落实时保留结果集中的位置。
注: 仅当 JDBC 驱动程序支持 JDBC 3.0 或更高版本时,hold 选项才可用。
hold 选项在下列情况下适用:
  • 正在使用 EGL open 语句来打开游标而不是存储过程;并且
  • 您想要定期落实更改而不丢失您在结果集中所处的位置;并且
  • 数据库管理系统支持在 SQL 游标声明中使用 WITH HOLD 选项。
例如,代码可以执行下列操作:
  1. 通过运行 EGL open 语句来声明并打开游标
  2. 通过运行 EGL get next 语句来访存行
  3. 在一个循环中执行以下操作:
    1. 以某种方式处理数据
    2. 通过运行 EGL replace 语句来更新行
    3. 通过运行系统函数 sysLib.commit 来落实更改
    4. 通过运行 EGL get next 语句来访存另一行

如果未指定 hold,则由于游标不再是打开的,所以步骤 3d 的第一次运行将失败。

在落实时不会关闭对其指定了 hold 的游标,但回滚或数据库连接将关闭所有游标。

如果不需要跨落实保留游标位置,则不要指定 hold

forUpdate
一个选项,它允许以后使用 EGL 语句来替换或删除从数据库中检索到的数据。

如果正在调用存储过程以检索结果集,则不能指定 forUpdate。

usingKeys ... item
标识用来构建隐式 SQL 语句中的 WHERE 子句的键值部分的键项列表。如果未指定显式 SQL 语句,则在运行时将使用隐式 SQL 语句。

如果未指定 usingKeys 子句,则隐式语句的键值部分基于在 open 语句中引用的 SQL 记录部件。

如果指定显式 SQL 语句,则将忽略 usingKeys 信息。

with #sql{ sqlStatement }
显式 SQL SELECT 语句,如果还指定了 SQL 记录,则此语句是可选的。不要在 #sql 与左花括号之间留下任何空格。
into ... item
INTO 子句,它标识从游标或存储过程中接收值的 EGL 主变量。在与此子句类似的子句中(该子句位于 #sql{ } 块外部),不要在主变量名称之前包括分号。
with preparedStatementID
在运行时准备 SQL SELECT 或 CALL 语句的 EGL prepare 语句的标识。open 语句动态地运行 SQL SELECT 或 CALL 语句。有关详细信息,请参阅 prepare
using ... item
USING 子句,它标识在运行时可供已准备的 SQL SELECT 或 CALL 语句使用的 EGL 主变量。在与此子句类似的子句中(该子句位于 #sql{ } 块外部),不要在主变量名称之前包括分号。
SQL record name
SQLRecord 类型的记录的名称。记录名或 sqlStatement 值是必需的;如果省略 sqlStatement,则 SQL SELECT 语句是从 SQL 记录派生的。

示例如下所示(采用名为 emp 的 SQL 记录):

  open empSetId forUpdate for emp;

  open x1 with
    #sql{
      select empnum, empname, empphone
      from employee
      where empnum >= :empnum
 			  for update of empname, empphone
    }

  open x2 with
    #sql{
      select empname, empphone
      from employee
      where empnum = :empnum
    }
  for emp;

  open x3 with
    #sql{
      call aResultSetStoredProc(:argumentItem)
    }

缺省处理

当指定 SQL 记录时,缺省情况下,open 语句的作用如下所示:
  • open 语句使一组行可用。所选行中的每一列都与一个结构项相关联,除了与只读结构项相关联的列以外,所有列都可以由 EGL replace 语句进行后续更新。
  • 如果对 SQL 记录只声明一个键项,则只要 SQL 表键列中的值大于等于 SQL 记录的键项中的值,open 语句就会选择所有满足特定于记录的缺省选择条件的行。
  • 如果对 SQL 记录声明了多个键,则特定于记录的缺省选择条件是唯一的搜索条件,并且 open 语句检索所有满足该条件的行。
  • 如果即未指定记录键也未指定缺省选择条件,则 open 语句选择表中的所有行。
  • 选择的行是未排序的。
在生成的代码中,EGL open 语句是由一个游标声明表示的,该游标声明包含 SQL SELECT 或 SQL SELECT FOR UPDATE 语句。缺省情况下,存在下列情况:
  • FOR UPDATE 子句(如果有的话)不包含只读结构项
  • 特定记录的 SQL SELECT 语句与以下语句类似:
      SELECT column01,
             column02, ...
             columnNN
      INTO   :recordItem01,
             :recordItem02, ...
             :recordItemNN
      FROM   tableName
      WHERE  keyColumn01 = :keyItem01
      FOR UPDATE OF
             column01,
             column02, ...
             columnNN

可以通过在 EGL open 语句中指定 SQL 语句来覆盖缺省值。

错误状态

存在着各种各样的无效情况,包括:
  • 包括了缺少 SELECT 的必需子句的 SQL 语句;必需子句包括 SELECT、FROM 和(如果指定 forUpdate 的话)FOR UPDATE OF
  • SQL 记录与一列相关联,但该列在运行时不存在或者与相关结构项不兼容
  • 指定了选项 forUpdate,并且代码尝试对下列任何一个 SQL 记录运行 open 语句:
    • 只包含只读结构项的 SQL 记录;或者
    • 与多个 SQL 表相关的 SQL 记录。
在下列情况下也可能发生问题:
  1. 定制了 EGL open 语句以进行更新,但未指示特定 SQL 表列可用于更新;并且
  2. open 语句相关的 replace 语句尝试修改该列。
可以用下列任何一种方法来解决此问题:
  • 定制 EGL open 语句时,在 SQL SELECT 语句的 FOR UPDATE OF 子句中包括列名;或者
  • 定制 EGL replace 语句时,在 SQL UPDATE 语句的 SET 子句中除去对该列的引用;或者
  • openreplace 语句接受缺省值。
使用条款 | 反馈
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.