COBOL - 使用相对和动态选项打开顺序数据集时的文件状态 37
COBOL - File Status 37 when opening sequential dataset with relative & dynamic options
我正在尝试打开顺序数据集。
我得到文件状态 37,IBM 说:
An OPEN statement was attempted on a file that would not support the
open mode specified in the OPEN statement. Possible violations are:
- The EXTEND or OUTPUT phrase was specified but the file would not support write operations.
- The I-O phrase was specified but the file would not support the input and output operations permitted.
- The INPUT phrase was specified but the file would not support read operations.
我怀疑第三个,因为我程序的相关部分是:
*----------------------
INPUT-OUTPUT SECTION.
*----------------------
FILE-CONTROL.
* input file 1
SELECT INPUT-1-FILE
ASSIGN TO EXAMPLE
ORGANIZATION IS RELATIVE
ACCESS MODE IS DYNAMIC
RELATIVE KEY IS INPUT-1-ACCESS-KEY
FILE STATUS IS INPUT-1-FS
.
****************
DATA DIVISION.
****************
*--------------
FILE SECTION.
*--------------
* fichier 1
FD INPUT-1-FILE
.
01 INPUT-1-LINE.
05 filler PIC X(300).
*-------------------------
WORKING-STORAGE SECTION.
*-------------------------
77 INPUT-1-ACCESS-KEY PIC 9(3) comp value 1.
01 INPUT-1-FS PIC 99 value 00.
*********************
PROCEDURE DIVISION.
*********************
OPEN INPUT INPUT-1-FILE
DISPLAY INPUT-1-FS
我的 JCL 中的 DD 卡看起来像:
EXAMPLE DD DISP=SHR,DSN=MY.DATASET.NAME
我们使用的是 COBOL v5,所以我检查了 IBM's relevant docs,但我找不到我的文件无法在输入模式下打开的任何原因。
这是我的数据集的特征:
VSAM listcat 的结果:
在问题中链接的 IBM 文档中(第 126 页:FILE-CONTROL 段落)据说相对访问模式仅适用于 VSAM 文件:
问题:输入文件目前不是VSAM文件。
解决方法:将输入文件设为VSAM文件。
这有效:
创建输入文件时JCL中的DD卡:
//FOO DD DISP=(NEW,CATLG,DELETE),
// SPACE=(TRK,(1000,1000),RLSE),
// LRECL=300,
// RECORG=RR,
// DSN=MY.DATASET.NAME
RECORG parameter 使数据集成为 RRDS。这些线路没有容易定义的密钥,所以我不能使用 KSDS,我需要随机访问,所以也没有 ESDS。
读取数据集的DD卡:
//BAR DD DISP=SHR,DSN=MY.DATASET.NAME
然后在 COBOL 程序中(FILE-CONTROL
):
SELECT INPUT-FILE
ASSIGN TO BAR
ORGANIZATION IS RELATIVE
ACCESS MODE IS DYNAMIC
RELATIVE KEY IS INPUT-FILE-KEY
FILE STATUS IS INPUT-FILE-STATUS
.
在你的程序中,ORGANIZATION IS RELATIVE
表示输入文件必须是相对记录数据集(RRDS
)VSAM文件,可以使用IDCAMS DEFINE
命令定义。可能发生的情况是,如果您打开的文件是顺序文件,则文件状态为 37。IBM 红皮书 "VSAM Demystified" 第 1.5.3 节中提到了有关 IDCAMS DEFINE
的更多信息,'Relative record data set'.
您可以使用如下内容将输入文件设为 VSAM 文件:
//[YOURID] JOB ,
// MSGCLASS=S,REGION=0M,COND=(9,LT),NOTIFY=&SYSUID,TIME=(1,1)
//*********************************************************************
//* Create a VSAM
//*********************************************************************
//S1IDCAMS EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DELETE ([YOURID].P00695.VSAMRRDS) CLUSTER PURGE
DEFINE CLUSTER (NAME([YOURID].P00695.VSAMRRDS) -
NUMBERED -
RECORDSIZE(80 80) -
BUFFERSPACE(2048) -
SHAREOPTIONS(4 3) -
VOLUMES(SYS162)) -
DATA (NAME([YOURID].P00695.VSAMRRDS.DATA) -
TRACK(1,1) -
CISZ (1024))
/*
//S2REPRO EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//VSAM DD DISP=SHR,DSN=[YOURID].P00695.VSAMRRDS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
REPRO OUTFILE(VSAM) INFILE(INREC)
/*
//INREC DD *
XXXXXXX060ALISONALISONALISONALISONALISONALISONALISONALISONAL ISONALIS
XXXXXXX060ALISONALISONALISONALISONALISONALISONALISONALISONAL ISONALIS
/*
如果你想打开一个顺序数据集进行读取,你需要打开它进行输入(完成!),将它放在 JCL 中,DISP=SHR(你可以尝试使用 OLD,但不需要它), 并具有 ACCESS IS SEQUENTIAL。
其他用户指出的 ACCESS IS RELATIVE 仅适用于 VSAM,您的 IDCAMS 输出显示这不是 VSAM 文件。如果它只是一个顺序数据集,你也不需要密钥。
我正在尝试打开顺序数据集。
我得到文件状态 37,IBM 说:
An OPEN statement was attempted on a file that would not support the open mode specified in the OPEN statement. Possible violations are:
- The EXTEND or OUTPUT phrase was specified but the file would not support write operations.
- The I-O phrase was specified but the file would not support the input and output operations permitted.
- The INPUT phrase was specified but the file would not support read operations.
我怀疑第三个,因为我程序的相关部分是:
*----------------------
INPUT-OUTPUT SECTION.
*----------------------
FILE-CONTROL.
* input file 1
SELECT INPUT-1-FILE
ASSIGN TO EXAMPLE
ORGANIZATION IS RELATIVE
ACCESS MODE IS DYNAMIC
RELATIVE KEY IS INPUT-1-ACCESS-KEY
FILE STATUS IS INPUT-1-FS
.
****************
DATA DIVISION.
****************
*--------------
FILE SECTION.
*--------------
* fichier 1
FD INPUT-1-FILE
.
01 INPUT-1-LINE.
05 filler PIC X(300).
*-------------------------
WORKING-STORAGE SECTION.
*-------------------------
77 INPUT-1-ACCESS-KEY PIC 9(3) comp value 1.
01 INPUT-1-FS PIC 99 value 00.
*********************
PROCEDURE DIVISION.
*********************
OPEN INPUT INPUT-1-FILE
DISPLAY INPUT-1-FS
我的 JCL 中的 DD 卡看起来像:
EXAMPLE DD DISP=SHR,DSN=MY.DATASET.NAME
我们使用的是 COBOL v5,所以我检查了 IBM's relevant docs,但我找不到我的文件无法在输入模式下打开的任何原因。
这是我的数据集的特征:
VSAM listcat 的结果:
在问题中链接的 IBM 文档中(第 126 页:FILE-CONTROL 段落)据说相对访问模式仅适用于 VSAM 文件:
问题:输入文件目前不是VSAM文件。
解决方法:将输入文件设为VSAM文件。
这有效:
创建输入文件时JCL中的DD卡:
//FOO DD DISP=(NEW,CATLG,DELETE),
// SPACE=(TRK,(1000,1000),RLSE),
// LRECL=300,
// RECORG=RR,
// DSN=MY.DATASET.NAME
RECORG parameter 使数据集成为 RRDS。这些线路没有容易定义的密钥,所以我不能使用 KSDS,我需要随机访问,所以也没有 ESDS。
读取数据集的DD卡:
//BAR DD DISP=SHR,DSN=MY.DATASET.NAME
然后在 COBOL 程序中(FILE-CONTROL
):
SELECT INPUT-FILE
ASSIGN TO BAR
ORGANIZATION IS RELATIVE
ACCESS MODE IS DYNAMIC
RELATIVE KEY IS INPUT-FILE-KEY
FILE STATUS IS INPUT-FILE-STATUS
.
在你的程序中,ORGANIZATION IS RELATIVE
表示输入文件必须是相对记录数据集(RRDS
)VSAM文件,可以使用IDCAMS DEFINE
命令定义。可能发生的情况是,如果您打开的文件是顺序文件,则文件状态为 37。IBM 红皮书 "VSAM Demystified" 第 1.5.3 节中提到了有关 IDCAMS DEFINE
的更多信息,'Relative record data set'.
您可以使用如下内容将输入文件设为 VSAM 文件:
//[YOURID] JOB ,
// MSGCLASS=S,REGION=0M,COND=(9,LT),NOTIFY=&SYSUID,TIME=(1,1)
//*********************************************************************
//* Create a VSAM
//*********************************************************************
//S1IDCAMS EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DELETE ([YOURID].P00695.VSAMRRDS) CLUSTER PURGE
DEFINE CLUSTER (NAME([YOURID].P00695.VSAMRRDS) -
NUMBERED -
RECORDSIZE(80 80) -
BUFFERSPACE(2048) -
SHAREOPTIONS(4 3) -
VOLUMES(SYS162)) -
DATA (NAME([YOURID].P00695.VSAMRRDS.DATA) -
TRACK(1,1) -
CISZ (1024))
/*
//S2REPRO EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//VSAM DD DISP=SHR,DSN=[YOURID].P00695.VSAMRRDS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
REPRO OUTFILE(VSAM) INFILE(INREC)
/*
//INREC DD *
XXXXXXX060ALISONALISONALISONALISONALISONALISONALISONALISONAL ISONALIS
XXXXXXX060ALISONALISONALISONALISONALISONALISONALISONALISONAL ISONALIS
/*
如果你想打开一个顺序数据集进行读取,你需要打开它进行输入(完成!),将它放在 JCL 中,DISP=SHR(你可以尝试使用 OLD,但不需要它), 并具有 ACCESS IS SEQUENTIAL。
其他用户指出的 ACCESS IS RELATIVE 仅适用于 VSAM,您的 IDCAMS 输出显示这不是 VSAM 文件。如果它只是一个顺序数据集,你也不需要密钥。