get next

EGL get next 语句从文件或消息队列中读取下一条记录,或者从数据库中读取下一行。

get next 语句的语法图
record name
I/O 对象的名称:带索引记录、MQ 记录、相对记录、串行记录或 SQL 记录。
from resultSetID
(仅适用于 SQL 处理)这是一个标识,它使 get next 语句与同一程序中之前运行的 open 语句相关。有关详细信息,请参阅 resultSetID
into
开始 EGL into 子句,该子句列示从关系数据库表接收值的项。
item
用于接收特定列的值的项。不要在项名前面加冒号(:)。

下面是文件访问示例:

  try
    open record1 forUpdate;
    onException
      myErrorHandler(8);
      return;
  end

      try
    get next record1; 
    onException
      myErrorHandler(12);
      return;
  end

      
  while (record1 not endOfFile)
    makeChanges(record1); // process the record

    try
      replace record1; 
    onException
      myErrorHandler(16);
      return;
    end

        
    try
      get next record1; 
    onException
      myErrorHandler(12);
      return;
    end

      end // end while
  
  sysLib.commit();

有关 get next 语句的详细信息取决于记录类型。有关 SQL 处理的详细信息,请参阅SQL 处理

带索引记录

当对带索引记录执行 get next 语句时,其作用取决于当前文件位置,该位置是由下列任何一项操作设置的:
  • 成功的输入或输出(I/O)操作,如 get 语句或另一个 get next 语句;或者
  • set record position 格式的 set 语句。
规则如下所示:
  • 当文件未打开时,get next 语句读取文件中具有最小键值的记录。
  • 每个后续 get next 语句都将读取相对于当前文件位置具有下一个最大键值的记录。重复键的例外情况在后面描述。
  • get next 语句读取文件中具有最大键值的记录之后,下一个 get next 语句将导致 I/O 错误值 endOfFile
  • 当前文件位置会受下列任何操作的影响:
    • set record position 格式的 EGL set 语句根据 set value(这是由 set 语句引用的带索引记录中的键值)确定文件位置。对同一个带索引记录执行的后续 get next 语句将读取键值等于或大于 set value 的文件记录。如果不存在这样的记录,则 get next 的结果是 endOfFile。
    • get next 语句之外的成功 I/O 语句将确定新的文件位置,并且,对同一个 EGL 记录发出的后续 get next 语句将读取下一个文件记录。例如,在 get previous 语句读取文件记录之后,get next 语句或者读取具有下一个最大键的文件记录,或者返回 endOfFile。
    • 如果 get previous 语句返回 endOfFile,则后续 get next 语句检索文件中的第一条记录。
    • 在不成功的 getget nextget previous 语句之后,文件位置是未定义的并且必须由 set record position 格式的 set 语句重新确定,或者由除 get nextget previous 语句之外的 I/O 操作来重新确定。
  • 当您正在使用备用索引且在文件中存在重复键时,下列规则适用:
    • 只有在 get next 语句读取了所有与最近检索的记录具有相同的键的记录之后,才检索具有更大键值的记录。键重复的记录的检索顺序就是 VSAM 返回记录的顺序。
    • 如果在除 get next 之外的成功 I/O 操作之后执行 get next,则 get next 将跳过任何具有重复键的记录,并检索具有下一个更大键的记录。
    • 当程序检索包含同一个键的一组记录中的最后一个记录时,不设置 EGL 错误值 duplicate
考虑包含下列键的文件:
  1, 2, 2, 2, 3, 4

下列每一个表都说明对同一带索引记录运行一系列 EGL 语句的效果。

EGL 语句(按顺序) 带索引记录中的键 语句检索到的文件记录中的键 EGL 错误值
get 2 2(三个中的第一个) duplicate
get next 任何 2(第二个) duplicate
get next 任何 2(第三个)
get next 任何 3

EGL 语句(按顺序) 带索引记录中的键 语句检索到的文件记录中的键 EGL 错误值
set(具有 set record position 格式) 2 不检索 duplicate
get next 任何 2(三个中的第一个)
get next 任何 2(第二个) duplicate
get next 任何 2(第三个)
get next 任何 3

消息队列

当对 MQ 记录执行 get next 时,将把队列中的第一条记录读入 MQ 记录。进行这种安排的原因是 get next 调用了一个或多个 MQSeries® 调用:

相对记录

当对相对记录执行 get next 语句时,作用取决于当前文件位置,该位置是由成功的输入或输出(I/O)操作(如 get 语句或另一个 get next 语句)设置的。规则如下所示:
  • 当文件未打开时,get next 语句读取文件中的第一条记录。
  • 每个后续 get next 都将读取相对于当前文件位置具有下一个最大键值的记录。
  • 如果下一条记录已被删除,则 get next 不会返回 noRecordFoundget next 将跳过已删除的记录并检索文件中的下一条记录。
  • get next 语句读取文件中具有最大键值的记录之后,下一个 get next 语句将导致 EGL 错误值 endOfFile
  • 当前文件位置会受下列任何操作的影响:
    • get next 之外的成功 I/O 语句将确定新的文件位置,并且,对同一个 EGL 记录发出的后续 get next 将读取下一个文件记录。
    • 在不成功的 getget nextget previous 语句之后,文件位置是未定义的并且必须由 set record position 格式的 set 语句重新确定,或者由除 get next 语句之外的 I/O 操作来重新确定。
  • get next 语句读取文件中最后一条记录之后,下一个 get next 语句将导致 EGL 错误值 endOfFilenoRecordFound

串行记录

当对串行记录执行 get next 语句时,其作用取决于当前文件位置,该位置是由另一个 get next 语句设置的。规则如下所示:
  • 当文件未打开时,get next 语句读取文件中的第一条记录。
  • 每个后续 get next 语句都读取下一条记录。
  • get next 语句读取了最后一条记录之后,后续的 get next 语句将导致 EGL 错误值 endOfFile
  • 如果生成的代码添加一个串行记录,然后对同一个文件发出与 get next 语句具有等同作用的语句,则在执行 get next 语句之前,EGL 将关闭并重新打开该文件。因此,跟随在 add 语句之后的 get next 语句读取文件中的第一条记录。当 get nextadd 语句位于不同的程序中,并且其中一个程序调用另一个程序时,也会发生这种行为。

建议避免在多个程序中同时打开同一个文件。

SQL 处理

当对 SQL 记录执行 get next 语句时,代码将从 open 语句选择的那些行中读取下一行。如果发出 get next 语句以检索由带有 forUpdate 选项的 open 语句选择的行,则可以执行下列任何操作:
  • 通过 EGL replace 语句更改行
  • 通过 EGL delete 语句除去行
  • 通过 EGL execute 语句更改或除去行

SQL FETCH 语句表示生成的代码中的 EGL get next 语句。生成的 SQL 语句的格式不能更改,但设置 INTO 子句除外。

如果发出 get next 语句并且该语句尝试访问位于最后一个所选行之后的行,下列描述是适用的:
  • 不会从结果集中复制任何数据
  • EGL 将 SQL 记录(如果有的话)设置为 noRecordFound
  • 如果相关的 open 语句包括 scroll 选项,则游标将保持打开状态,并且游标的位置保持不变。输出时,scroll 选项才有效。
  • 如果未设置 scroll 选项,游标将会关闭。

最后,当指定 SQL COMMIT 或 sysLib.commit 时,代码保留 open 语句中声明的游标中的位置,但仅当在 open 语句中使用 hold 选项时才会如此。

使用条款 | 反馈
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.