READPREV
文件浏览期间读取上一条记录;仅限 VSAM 和数据表。
语法
条件: DUPKEY , ENDFILE , FILENOTFOUND , ILLOGIC , INVREQ , IOERR , ISCINVREQ , LENGTH , LOCKED , NOTAUTH , NOTFND , RECORDBUSY 和 SYSIDERR
NOHANDLE、RESP 和 RESP2是常用选项,可添加到所有 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 命令来更新记录。
- 仅当以 RLS 方式访问文件时,才能在 READPREV 命令上指定 UPDATE。 如果对以非 RLS 方式访问的文件指定 UPDATE ,那么 CICS 将返回 INVREQ。
- 可以在 READPREV 上指定 UPDATE ,但不能在 STARTBR 或 RESETBR 命令上指定 UPDATE。
- 您可以在同一浏览中混用 UPDATE 和非更新请求。
- CICS 不会保留从一个 READPREV 命令到下一个 READPREV 命令的 UPDATE 选项。
CICS 在浏览序列中仅支持一个 TOKEN ,并且每个 READPREV 上的 TOKEN 值会使先前的值失效。
UPDATE 的锁定
- 如果您决定使用关联的令牌在浏览中删除或 REWRITE READPREV UPDATE 获取的最后一条记录,那么锁定将保持活动状态,如下所示:
- 如果文件可恢复,那么将在下一个同步点或回滚完成时释放锁定。
- 如果该文件不可恢复,那么锁定将在 ENDBR 完成时释放,但可能会提前释放。
- 如果您决定 不 更新上次读取的记录,那么当程序发出另一个 READNEXT 或 READPREV 命令或结束浏览时, CICS 将释放互斥锁定。
用于读完整性的锁定
- 如果指定 CONSISTENT 读完整性,那么仅在每个读请求的持续时间内保持共享锁定-即,直到将记录返回到程序为止。
- 如果指定REPE可重复读完整性,那么将在执行浏览的工作单元的持续时间内挂起共享锁定。 在这种情况下,您的程序可能会获取大量共享锁定,这将阻止为更新功能授予互斥锁定。 您应该谨慎地在浏览中使用REPE可用读完整性。
具有 UPDATE 或读完整性的函数输送 READPREV
- 如果使用了 ISC 链接,那么请求将接收到 ATNI 异常终止。
- 如果使用 MRO 链接,那么请求将接收到 AXF8 异常终止。
AXF8 是一个异常终止代码,由函数输送请求的发送方接收。 它指示已尝试向不支持更新或读完整性选项的 CICS 区域发送对 MRO 链接指定 UPDATE 的请求。
读完整性
以 RLS 方式访问文件时,非更新读请求可以指定读完整性选项 :UNCOMMITTED , CONSISTENT 或REPE可用。
如果未指定其中任何关键字,那么 CICS 将使用在 FILE 资源定义的 READINTEG 参数上指定的值,缺省值为 UNCOMMITTED。
- 远程文件拥有区域处于 CICS Transaction Server for OS/390®V 1 Release 1 (或更高版本) 级别。
- 远程系统中的 FILE 定义指定:
- RLS 方式
- 应用程序的正确读完整性值。
保留锁定和活动锁定
RECORDBUSY 指活动锁定, LOCKED 指保留锁定。
- 针对具有 保留 锁定的记录的 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 文件。
- 可重复 (仅限 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 不合逻辑
- 发生此情况时,将终止当前正在进行的浏览。
- 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 ,可能是由于耦合设施故障,在这种情况下,耦合设施数据表服务器也会发生故障。 有关重新启动耦合设施数据表服务器和重新装入表的信息,请参阅 设置和运行耦合设施数据表服务器 。
缺省操作: 异常终止任务。
