VSAM 状态代码 04

Sai*_*sha 1 cobol mainframe jcl

我正在运行一个 COBOL pgm,它正在读取一个 VSAM 文件。下面是我的 pgm 中的输入输出部分。

文件控制。

 SELECT INPUT-FILE         ASSIGN TO DDINPUT             
                           ORGANIZATION IS INDEXED           
                           ACCESS MODE  IS RANDOM            
                           RECORD KEY   IS INPUT-KEY                                
                           FILE STATUS  IS WS-INPUT-STATUS.
Run Code Online (Sandbox Code Playgroud)

和FD入口如下。

文件部分。

FD INPUT-FILE 是 EXTERNAL(因为它在 sub pgm 中)
COPY INPUTREC。

当我运行这个 pgm 时,它失败了,文件状态代码 =04。在某处我发现,当在 FD 中时,即使文件是 VB,我们也只有一条记录,它会将其视为 FB。所以FB应该有record contains或Varying子句。

当我更新我的 FD 时。

文件部分。

FD 输入文件是外部
记录,大小从 1 到 215 不等。复制输入。

工作运行良好。

我有一个疑问,我可以将这个 Varying 子句指定为最大长度,就像我把它写成例如 RECORD VARYING IN SIZE FROM 1 TO 2500。那么它会导致任何问题吗?

Mik*_*keC 5

假设您的 VSAM 文件已正确初始化并且您的 JCL 编码与您的程序要求一致,那么应该没有问题。

VARYING 子句只是告诉 COBOL 在缓冲区中为最大预期记录大小保留足够的空间,并指示该文件包含的记录大小在一次 I/O 调用和下一次调用之间可能会有所不同。如果它是 FB(固定块),COBOL 期望记录大小不变,如果记录偏离预期大小,将触发状态代码 04。对于 VB(变量块),如果您的记录大小超过最大 VARYING 定义的限制,则仍可能出现返回代码 04。

我个人觉得 COBOL I/O 状态条件有点难以理解。

下面是一个 ANSI COBOL I/O 状态代码表,我为文件 I/O 调试目的而保留它:

0x - Successful Completion
00 - No futher information
02 - Duplicate Key detected
04 - Wrong Length Record
05 - File created when opened.  With sequential VSAM 00 is returned.
07 - CLOSE with NO REWIND or REEL for non-tape dataset.

1x - End of File conditions
10 - No futher information
14 - Relative record READ outside boundry.

2x - Invalid Key condition
21 - Sequence Error
22 - Duplicate Key
23 - No Record found
24 - Key outside boundry

3x - Permanent I/O Errors
30 - No further information
34 - Record outside file boundry
35 - OPEN and required file not found.
37 - OPEN with invalid mode
38 - OPEN of file closed with a LOCK
39 - OPEN unsuccessful due to conflicting file attributes

4x - Logic Errors
41 - OPEN of file already open
42 - CLOSE of file not open
43 - READ  not executed before REWRITE
44 - REWRITE of different size record
46 - READ after EOF reached
47 - READ attempted for file not opened I-O or EXTEND
48 - WRITE for file not opened OUTPUT, I-O, or EXTEND
49 - DELETE or REWRITE for file not opened I-O

9x - Specific Compiler defined exceptions
90 - No further information
91 - VSAM Password failure
92 - Logic Error
93 - VSAM Resource unavailable
94 - VSAM Sequence record not available
95 - VSAM invalid or incomplete file information
96 - VSAM no DD statement
97 - VSAM OPEN successful, file integrity verified.
Run Code Online (Sandbox Code Playgroud)