READPREV

文件浏览期间读取上一条记录;仅限 VSAM 和数据表。

语法

READPREV

读取语法图跳过可视语法图READPREVFILE( filename)INTO( data-area)SET( ptr-引用)UNCOMMITTEDCONSISTENTREPEATABLEUPDATETOKEN( data-area)RIDFLD( data-area)KEYLENGTH( data-value)REQID( data-value)SYSID( 系统名称)LENGTH( data-area)LENGTH( data-area)RBARRNXRBANOSUSPEND

条件: DUPKEY , ENDFILE , FILENOTFOUND , ILLOGIC , INVREQ , IOERR , ISCINVREQ , LENGTH , LOCKED , NOTAUTH , NOTFND , RECORDBUSY 和 SYSIDERR

NOHANDLERESPRESP2是常用选项,可添加到所有 EXEC CICS 命令中以处理错误条件。 命令语法图和选项说明中没有明确包含这些选项。 有关这些常用选项和 EXEC CICS 命令语法的信息,请参阅 EXEC CICS 命令格式和编程注意事项.

如果此命令所引用的文件是:
  • 定义为远程,该命令是通过 IPIC 连接提供到远程 CICS® 区域的功能。
  • 定义为本地 VSAM 文件、VSAM RLS 文件或耦合设备数据表。
  • 6.2 后来 定义为共享数据表,且未指定 UPDATE 选项。
如果此命令所引用的文件是:
  • 定义为远程,并且该命令是通过非 IPIC 连接提供的功能。
  • 定义为 NSR。
  • 定义为 BDAM 文件。
  • 定义为共享数据表。

描述

READPREV 可重复用于从本地或远程系统上的 VSAM 文件以反向顺序读取记录。

这样一系列顺序读取命令称为文件的 浏览 。 浏览还可以按任意顺序包含一系列 READNEXT 和 READPREV 命令。 必须使用 STARTBR 命令启动浏览,以标识浏览的开始,并使用 ENDBR 命令终止浏览。

必须在 RIDFLD 选项中提供足够大的数据区,以包含文件中记录的完整标识 (完整键, RBA 或 RRN)。 此数据区同时用作输出和输入参数。

当 CICS在每个 READPREV 命令完成时,将刚刚检索到的记录的完整标识放置到 RIDFLD 数据区中时,它将用作输出参数。 然后, CICS 将保存此标识以标记后续 READPREV 要继续的点。

它也可以用作输入参数。 在发出下一个 READPREV 命令之前修改 RIDFLD 会导致该命令将浏览重新定位到新的标识,从该标识以通常的方式继续。 修改后的记录标识必须始终是完整键, RBA 或 RRN。 不能指定通用键,使用 GENERIC 选项启动的浏览也不能包含 READPREV 命令。

如果在 STARTBR 命令之后立即包含 READPREV 命令,那么 STARTBR 命令 RIDFLD 必须指定数据集上存在的记录的键; 否则将发生 NOTFND 条件。

在 READNEXT 之后的 READPREV 命令,或者未指定 "last" 键值的 STARTBR 或 RESETBR 被视为已修改 RIDFLD 值并导致重新定位 (如上)。

读取以 RLS 方式访问的文件

对于以 RLS 方式访问的文件,可以在 READPREV 请求中包含 UPDATE 关键字以在浏览期间更新某些记录。 如果指定 UPDATE ,那么还必须指定 TOKEN。 然后,可以通过发出指定在浏览功能上返回的 TOKEN 的 DELETE 或 REWRITE 命令来更新记录。

注: 不带 UPDATE 关键字的 TOKEN 意味着 UPDATE。
UPDATE 选项的使用遵循以下规则:
  • 仅当以 RLS 方式访问文件时,才能在 READPREV 命令上指定 UPDATE。 如果对以非 RLS 方式访问的文件指定 UPDATE ,那么 CICS 将返回 INVREQ。
  • 可以在 READPREV 上指定 UPDATE ,但不能在 STARTBR 或 RESETBR 命令上指定 UPDATE。
  • 您可以在同一浏览中混用 UPDATE 和非更新请求。
  • CICS 不会保留从一个 READPREV 命令到下一个 READPREV 命令的 UPDATE 选项。

    CICS 在浏览序列中仅支持一个 TOKEN ,并且每个 READPREV 上的 TOKEN 值会使先前的值失效。

UPDATE 的锁定

对 READPREV 命令指定 UPDATE 将获取互斥锁定。 浏览中这些互斥锁定的持续时间取决于应用程序执行的操作:
  • 如果您决定使用关联的令牌在浏览中删除或 REWRITE READPREV UPDATE 获取的最后一条记录,那么锁定将保持活动状态,如下所示:
    • 如果文件可恢复,那么将在下一个同步点或回滚完成时释放锁定。
    • 如果该文件不可恢复,那么锁定将在 ENDBR 完成时释放,但可能会提前释放。
  • 如果您决定 更新上次读取的记录,那么当程序发出另一个 READNEXT 或 READPREV 命令或结束浏览时, CICS 将释放互斥锁定。
重要信息: UNLOCK 命令 释放 VSAM 对 READPREV UPDATE 获取的记录持有的互斥锁定。 浏览中的 UNLOCK 会使上次请求返回的 TOKEN 失效。

用于读完整性的锁定

指定其中一个读完整性选项将获取每个 READPREV 上的共享锁定。 使用浏览的这些共享锁定的持续时间取决于您指定的读完整性类型:
  • 如果指定 CONSISTENT 读完整性,那么仅在每个读请求的持续时间内保持共享锁定-即,直到将记录返回到程序为止。
  • 如果指定REPE可重复读完整性,那么将在执行浏览的工作单元的持续时间内挂起共享锁定。 在这种情况下,您的程序可能会获取大量共享锁定,这将阻止为更新功能授予互斥锁定。 您应该谨慎地在浏览中使用REPE可用读完整性。

具有 UPDATE 或读完整性的函数输送 READPREV

如果指定 UPDATE 或其中一个读完整性选项的 READPREV 命令被函数输送到不支持 UPDATE 或读完整性选项的 CICS 产品系列的成员,那么请求将失败:
  • 如果使用了 ISC 链接,那么请求将接收到 ATNI 异常终止。
  • 如果使用 MRO 链接,那么请求将接收到 AXF8 异常终止。

    AXF8 是一个异常终止代码,由函数输送请求的发送方接收。 它指示已尝试向不支持更新或读完整性选项的 CICS 区域发送对 MRO 链接指定 UPDATE 的请求。

读完整性

以 RLS 方式访问文件时,非更新读请求可以指定读完整性选项 :UNCOMMITTED , CONSISTENT 或REPE可用。

如果未指定其中任何关键字,那么 CICS 将使用在 FILE 资源定义的 READINTEG 参数上指定的值,缺省值为 UNCOMMITTED。

如果要使用 FILE 定义的 READINTEG 关键字中指定的读完整性级别,然后需要从使用本地文件更改为远程文件,或者如果更改远程文件的位置,请确保:
  • 远程文件拥有区域处于 CICS Transaction Server for OS/390®V 1 Release 1 (或更高版本) 级别。
  • 远程系统中的 FILE 定义指定:
    • RLS 方式
    • 应用程序的正确读完整性值。

保留锁定和活动锁定

RECORDBUSY 指活动锁定, LOCKED 指保留锁定。

这些锁定会影响获取锁定的 READPREV 请求; 即,具有读完整性的更新请求和请求。 这些是下列项目符号中引用的 READPREV 请求的类型。 其他 READPREV 请求不受保留锁定或活动锁定的影响。
  • 针对具有 保留 锁定的记录的 READPREV 请求始终被 LOCKED 响应拒绝。
  • 对具有 活动 锁定的记录的 READPREV 请求等待锁定释放,除非指定了 NOSUSPEND 关键字,在这种情况下, CICS 将返回 RECORDBUSY 响应。

选项

CONSISTENT (仅限 RLS)
将使用 VSAM 共享锁定提供的读完整性级别来读取记录,该级别将持续请求的持续时间。
如果另一个任务正在修改记录,因此该任务具有互斥锁定,那么 READPREV 请求将等待更新完成 (除非还指定了 NOSUSPEND) ,如下所示:
  • 对于针对不可恢复文件的 READPREV 请求,只要执行更新的任何 VSAM 请求完成, READPREV 就会完成。
  • 对于针对可恢复文件的 READPREV 请求,当更新任务完成其下一个同步点或回滚时, READPREV 请求将完成。
FILE (filename)
指定要浏览的文件的名称。

如果指定了 SYSID ,那么假定此文件引用的数据集位于远程系统上,而不考虑是否在文件资源定义中定义了该名称。 否则,将使用文件定义来确定数据集是在本地系统上还是在远程系统上。

INTO (data-area)
指定要将从数据集检索的记录写入其中的数据区。
KEYLENGTH (data-value)
指定 RIDFLD 选项中指定的键的长度 (半字二进制) ,除非指定了 RBA 或 RRN ,在这种情况下, KEYLENGTH 无效。 如果指定的长度与为数据集定义的长度不同,那么会出现 INVREQ 条件。

对于远程文件,可以在 FILE 定义中指定 KEYLENGTH。 如果未在其中定义 KEYLENGTH ,并且未在应用程序中指定 KEYLENGTH ,并且键的长度超过 4 个字符,那么缺省值为 4。

LENGTH (数据区)
指定要放置记录的数据区的长度 (作为半字二进制值)。 READNEXT 命令完成时, LENGTH 参数包含记录的实际长度。

如果指定了 SYSID ,那么必须指定此选项。

如果该文件位于远程系统上,那么无需在此处设置 LENGTH 参数,但必须在文件资源定义中设置

如果文件位于本地系统上,那么必须使用 INTO 选项为可变长度记录设置 LENGTH 参数,但不能为固定长度记录设置 LENGTH 参数。 但是,最好指定固定长度记录的长度,因为:
  • 这将导致检查正在读取的记录对于可用数据区的长度是否不太长。
  • 在 COBOL、C®、 PL/I 和汇编语言应用程序中,如果指定了 LENGTH 选项,当浏览固定长度记录到一个比正在访问的记录更长的区域时,就会引发 LENGERR 条件。 如果未显式指定 LENGTH 选项,那么如果可以从数据区推断长度,那么将返回 LENGERR 条件。 如果指定的长度超过文件记录长度, CICS 将使用较长的长度进行移动。 如果应用程序中的目标区域不够大,那么存储将覆盖到目标区域之外。

如果指定 SET 选项,那么不需要同时指定 LENGTH 选项。

当浏览到比正在读取的记录更长的目标数据区时,从检索到的记录的末尾到目标数据区的末尾,目标数据区的内容是不可预测的。

如果指定 INTO 选项,那么 LENGTH 自变量必须是指定程序接受的最大记录的数据区。 如果检索到的记录比 LENGTH 选项中指定的值长,那么会将该记录截断为指定的值,并出现 LENGERR 条件。 在这种情况下, LENGTH 数据区设置为截断前记录的长度。

请注意,如果未指定长度,那么针对本地 CICS 系统上定义的文件中的可变长度记录发出的文件控制命令将失败,并带有 LENGERR 条件。 但是,如果对远程系统上定义的文件发出同一命令,那么该命令不会失败。

NOSUSPEND (仅限 RLS)
如果记录被 VSAM 锁定并具有活动锁定 (包括由于死锁而锁定的记录) ,那么请求不会等待。
注: 在 CICS 返回 RECORDBUSY 响应之前,指定 NOSUSPEND 等待至少 1 秒的请求。
RBA
(VSAM KSDS 或 ESDS 基本数据集,或者仅 CICS维护的数据表,而不是路径) 指定 RIDFLD 选项中指定的记录标识字段包含相对字节地址。

当 STARTBR 或 RESETBR 命令指定 RBA 选项时,必须指定此选项。 当 STARTBR 或 RESETBR 命令未指定 RBA 时,不得指定此参数。

不能将 RBA 用于:
  • 用户维护的数据表
  • 耦合设施数据表
  • 以 RLS 访问方式打开的任何 KSDS 文件
  • 使用扩展寻址的 KSDS 文件。
此外,建议不要将 RBA 用于存放超过 4GB的 ESDS 文件。 (请改为使用 XRBA。)
可重复 (仅限 RLS)
将使用 VSAM 共享锁定提供的读完整性级别来读取记录,该级别将持续发出读请求的工作单元的持续时间。
如果另一个任务正在修改记录,因此该任务具有互斥锁定,那么 READPREV 请求将等待更新完成 (除非还指定了 NOSUSPEND) ,如下所示:
  • 对于可恢复文件, READPREV 请求在更新事务完成其下一个同步点或回滚时完成。
  • 对于不可恢复文件, READPREV 将在执行更新的 VSAM 请求完成后立即完成。

完成 READPREV 请求后,记录将保持锁定于发出 READPREV 的任务。 其他任务可以继续读取记录,但在发出 READPREV 的任务执行其下一个同步点或回滚之前,不允许其他任务更新记录。

REQID (data-value)
将浏览的唯一请求标识指定为半字二进制值,用于控制对文件的多个浏览操作。 如果未指定此选项,那么将采用缺省值 0。
RIDFLD (数据区)
指定记录标识字段。 内容可以是键,相对字节地址或相对记录号。 对于相对字节地址或相对记录号,此字段的格式必须是全字二进制。 对于相对字节地址, RIDFLD 值可以大于或等于零。 对于相对记录号, RIDFLD 值可以大于或等于 1。

完成 READPREV 命令后, CICS 将使用检索到的记录的完整标识来更新此字段。

RRN
(VSAM RRDS) 指定 RIDFLD 选项中指定的记录标识字段包含相对记录号。
SET (ptr-ref)
指定要设置为检索到的记录的地址的指针引用。

在汇编语言中,如果出现 DUPKEY 条件,那么不会设置指定的寄存器,但可以从 DFHEITP1装入。

指针引用一直有效,直到下一个 READPREV 或 READNEXT 命令为同一文件的同一浏览 (REQID) 指定 SET 为止。 在 ENDBR 或 SYNCPOINT 命令之后,指针不再有效。 如果要保留指针所寻址的字段中的数据,那么必须将其移至您自己的区域。

如果 DATALOCATION (ANY) 与应用程序相关联,那么 SET 指针中返回的地址可以高于或低于 16 MB 线。

如果 DATALOCATION (BELOW) 与应用程序相关联,那么在 SET 指针中返回的地址低于 16 MB 线。

如果为正在运行的任务指定了 TASKDATAKEY (USER) ,那么返回的数据位于用户密钥存储器中; 否则,返回的数据位于 CICS-key 存储器中。

SYSID (systemname)
指定请求所定向到的系统的名称。

如果指定 SYSID 并同时省略 RBA 和 RRN ,那么还必须指定 LENGTH 和 KEYLENGTH。

TOKEN (数据区) (仅限 RLS)
作为全字二进制值返回此 READPREV UPDATE 请求的唯一标识。 这是文件控制返回给请求任务的输出值,用于将后续 REWRITE 或 DELETE (或 UNLOCK) 请求与此 READPREV 命令上返回的记录相关联。

应用程序必须在后续 REWRITE 或 DELETE 命令上指定返回的 TOKEN ,以标识要重写或删除的记录。 应用程序还可以在后续 UNLOCK 命令上指定返回的 TOKEN ,以标识正在失效的令牌。

如果指定了 UPDATE ,那么必须指定 TOKEN (但如果指定了不带 UPDATE 的 TOKEN ,那么将采用 UPDATE)。

对于给定的 REQID , CICS 一次仅支持一个活动的 TOKEN。 因此, TOKEN 值仅在以下 READNEXT , READPREV 或 ENDBR 命令用于此浏览之前有效,或者在 REWRITE , DELETE 或 UNLOCK 命令之前有效 (以先者为准)。

可以交付 TOKEN 函数。 但是,如果指定 TOKEN 的请求是传递给无法识别此关键字的 CICS 系列产品的成员的函数,那么请求将失败。

已落实
在没有读完整性的情况下读取记录。 返回 VSAM 已知的当前数据。 不会尝试将此读请求与同一记录的任何并发更新活动一起序列化。 该记录可能正在由另一个事务更新,因此如果该更新随后回退,那么该记录的值可能会稍后更改。
UPDATE (仅 RLS)
指定要获取记录以进行更新或删除。 如果同时省略了此选项和 TOKEN ,那么将假定为只读。

如果指定 UPDATE ,那么还必须指定 TOKEN。

UPDATE 仅对定义到本地区域的文件有效

XRBA
指定 RIDFLD 选项中指定的记录标识字段包含扩展的相对字节地址。 当浏览 ESDS 扩展寻址数据集中的记录时,应使用此选项。

除非关联的 STARTBR 或 RESETBR 命令也指定了 XRBA ,否则不能在 READPREV 命令上指定 XRBA。

XRBA 无法访问 KSDS 数据集。

条件

15 个 DUPKEY
RESP2 值:
140
通过具有 NONUNIQUEKEY 属性的备用索引检索记录,并且存在另一个具有相同键的备用索引记录。

在汇编语言中,如果正在使用 SET 选项,那么指定的寄存器尚未设置,但可以从 DFHEITP1装入。

缺省操作: 异常终止任务。

20 个 ENDFILE
RESP2 值:
90
在浏览期间检测到文件结束条件。

缺省操作: 异常终止任务。

12 个 FILENOTFOUND
RESP2 值:
1
未对 CICS定义 FILE 选项中引用的文件名。

缺省操作: 异常终止任务。

21 不合逻辑
发生此情况时,将终止当前正在进行的浏览。
RESP2 值 (VSAM):
110
发生不在其他某个 CICS 响应类别中的 VSAM 错误。

请参阅 EXEC 接口块中的 EIBRCODE; 有关详细信息,请参阅 EIB 字段

缺省操作: 异常终止任务。

16 INVREQ
RESP2 值:
20
FILE 定义不允许更新。
24
对先前 STARTBR 或 RESETBR 命令具有 GENERIC 选项的文件发出 READPREV 命令。
26 日
指定了 KEYLENGTH 选项,指定的长度不等于为此文件所引用的数据集定义的长度。
37
已更改用于在浏览期间访问数据集的记录标识类型 (例如,键或相对字节地址)。 不能在 STARTBR 上指定一种类型的寻址,也不能在 READPREV 上指定另一种类型的寻址。
39
针对 BDAM 文件发出 READPREV。
41
REQID , SYSID 或文件名与任何成功的 STARTBR 命令的名称不匹配。
52
不允许 CONSISTENT ,因为该文件不是以 RLS 方式访问的 VSAM 文件。
53
不允许REPE可重复,因为该文件不是以 RLS 方式访问的 VSAM 文件。
54
不允许 UPDATE ,因为该文件不是以 RLS 方式访问的 VSAM 文件。
55
不允许 NOSUSPEND ,因为该文件不是以 RLS 方式访问的 VSAM 文件。
57
尝试更新文件失败,因为关联的 VSAM 数据集的 AVAILABILITY 状态为 RREPL ,这将不允许更新操作 (来自复制程序的操作除外)。

缺省操作: 异常终止任务。

17 IOERR
RESP2 值:
120
浏览期间发生 I/O 错误。 I/O 错误是 CICS 条件未涵盖的任何异常事件。

对于 VSAM 文件, IOERR 通常指示硬件错误。 EXEC 接口块中提供了更多信息; 有关详细信息,请参阅 EIB 字段

对于耦合设施数据表, IOERR 指示从耦合设施访问返回的响应不正确。

缺省操作: 异常终止任务。

54 ISCINVREQ
RESP2 值:
70
远程系统指示不符合已知条件的故障。

缺省操作: 异常终止任务。

22 LENGERR
RESP2 值:
10
对于具有可变长度记录的文件,既未指定 LENGTH 选项,也未指定 SET 选项。
11
使用指定的 INTO 选项读取的记录长度超过 LENGTH 选项中指定的值; 记录被截断,并且 LENGTH 选项中提供的数据区设置为记录的实际长度。
13
为具有固定长度记录的文件指定了不正确的长度。

缺省操作: 异常终止任务。

100 个已锁定
RESP2 值:
106
The read request specifies the UPDATE keyword, or one of the read integrity keywords CONSISTENT or REPEATABLE, or the file resource definition specifies read integrity, but VSAM holds a retained lock against the record (see 保留锁定和活动锁定).

锁定记录的密钥不会返回到应用程序。 如果您处理此情况并将控制权返回给程序,那么浏览可以继续并通过发出另一个 READPREV 请求来检索锁定记录之后的记录。

如果正在读取的记录被保留锁定,那么对使用锁定模型的可恢复 CFDT 的请求也可能发生 LOCKED 条件。 有关调查耦合设施数据表中记录的保留锁定的信息,请参阅 耦合设施数据表保留锁定

缺省操作: 使用代码 AEX8异常终止任务。

70 NOTAUTH
RESP2 值:
101
对 FILE (filename) 执行资源安全性检查失败。

缺省操作: 异常终止任务。

13 NOTFND
RESP2 值:
80
尝试根据提供的搜索参数检索记录失败。 发生这种情况的一个地方是 READPREV 命令紧跟在 STARTBR 或 RESETBR 命令之后,该命令指定了 GTEQ 以及数据集中不存在的记录的键。
81
指定了 XRBA ,并且 RIDFLD 的值大于 4 GB ,但数据集不是扩展寻址 ESDS。

缺省操作: 异常终止任务。

101 记录 DBUSY
RESP2 值:
107
在请求上指定了 NOSUSPEND ,但 VSAM 对记录持有活动锁定,这将导致请求等待 (请参阅 保留锁定和活动锁定)。

锁定记录的密钥不会返回到应用程序。 如果您处理此情况并将控制权返回给程序,那么浏览可以继续并通过发出另一个 READPREV 请求来检索锁定记录之后的记录。

缺省操作: 使用代码 AEX9异常终止任务。

53 个 SYSIDERR
RESP2 值:
130
SYSID 选项指定的名称既不是本地系统,也不是由 CONNECTION 或 IPCONN 定义定义的远程系统。 当到远程系统的链接已知但不可用时,也会发生 SYSIDERR。 对于 IPCONN ,如果链路已知,但本地或远程系统不支持使用 IP 互连交付的功能的文件控制命令,那么将发生 SYSIDERR。
131
对于耦合设施数据表,与耦合设施数据表服务器的连接已失败。 这可能是因为服务器本身已发生故障,或者服务器可用,但 CICS 未能连接到该服务器。
132
对不再存在的耦合设施数据表发出 READPREV ,可能是由于耦合设施故障,在这种情况下,耦合设施数据表服务器也会发生故障。 有关重新启动耦合设施数据表服务器和重新装入表的信息,请参阅 设置和运行耦合设施数据表服务器

缺省操作: 异常终止任务。