get previous

EGL get previous 语句读取关系数据库结果集中的上一行或文件中的上一个记录,该文件与指定 EGL 的带索引记录相关联。

仅当在相关 open 语句中指定了 scroll 选项时,才能对关系数据库结果集使用此语句。


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

下面是带索引记录的示例:

  record1.hexKey = "FF";
  set record1 position;

  try
    get previous record1;
  onException
    myErrorHandler(8);
    return;
  end

    
  while (record1 not endOfFile)
    processRecord(record1); // handle the data

    try
      get previous record1;
    onException
      myErrorHandler(8);
      return;
    end

    end

  

有关 get previous 的详细信息取决于您是否在使用带索引记录或是否与SQL 处理有关。

带索引记录

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

下列各表举例说明了对同一个带索引记录运行一连串 EGL 语句的作用。

EGL 语句(按顺序) 带索引记录中的键 语句检索到的文件记录中的键 COBOL 的 EGL 错误值
set(具有 set record position 格式) 1 -- --
get previous 任何 1 --

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

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

EGL 语句(按顺序) 带索引记录中的键 语句检索到的文件记录中的键 EGL 错误值
set(具有 set record position 格式) 1 -- --
get previous 任何 1 --

SQL 处理

当对 SQL 记录执行 get previous 语句时,代码将从 open 语句选择的那些行读取上一行,但仅当您指定了 scroll 选项才会如此。如果发出 get previous 语句以检索由同时带有 forUpdate 选项的 open 语句选择的行,可以执行下列任何任务:
  • 通过 EGL replace 语句更改行
  • 通过 EGL delete 语句除去行
  • 通过 EGL execute 语句更改或除去行

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

如果发出 get previous 语句并且该语句尝试访问位于第一个所选行之前的行,EGL 运行时将进行如下操作:
  • 不会从结果集中复制数据
  • 让游标处于打开状态,并且游标位置保持不变
  • 将 SQL 记录(如果有的话)设置为 noRecordFound

一般来说,如果发生了错误并且处理继续进行,游标将保持打开状态,并且游标位置保持不变。

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

相关概念
记录类型和属性

相关任务
语法图

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