Mainframe中COBOL表非关键字匹配记录的检索方法咨询
获取COBOL表中不匹配关键字段的记录方法
一、在COBOL程序内直接处理
遍历整个表的所有记录,判断每条记录的关键字段是否与目标值不匹配,满足条件则输出或存储该记录。
示例代码片段(针对内部表):
WORKING-STORAGE SECTION. 01 WS-TABLE-DATA. 05 WS-TABLE-REC OCCURS 100 TIMES INDEXED BY WS-TBL-IDX. 10 WS-KEY-FIELD PIC X(05). 10 WS-OTHER-DATA PIC X(20). 01 WS-TARGET-KEY PIC X(05) VALUE 'ABCDE'. PROCEDURE DIVISION. PERFORM VARYING WS-TBL-IDX FROM 1 BY 1 UNTIL WS-TBL-IDX > 100 IF WS-KEY-FIELD(WS-TBL-IDX) NOT EQUAL TO WS-TARGET-KEY WRITE OUTPUT-RECORD FROM WS-TABLE-REC(WS-TBL-IDX) END-IF END-PERFORM.
针对外部文件(如VSAM/顺序文件):
把遍历逻辑改成逐行读取文件,判断后输出:
WORKING-STORAGE SECTION. 01 END-OF-INPUT-FILE PIC X(01) VALUE 'N'. 01 WS-TARGET-KEY PIC X(05) VALUE 'ABCDE'. PROCEDURE DIVISION. OPEN INPUT INPUT-FILE OPEN OUTPUT NON-MATCH-FILE PERFORM UNTIL END-OF-INPUT-FILE = 'Y' READ INPUT-FILE AT END SET END-OF-INPUT-FILE TO 'Y' NOT AT END IF INPUT-KEY NOT EQUAL TO WS-TARGET-KEY WRITE NON-MATCH-REC FROM INPUT-REC END-IF END-READ END-PERFORM CLOSE INPUT-FILE NON-MATCH-FILE
注意:如果是VSAM KSDS,不要使用START命令定位匹配记录,直接从第一条开始逐行读取判断,否则会跳过不匹配的记录。
二、使用Mainframe排序工具(DFSORT/ICETOOL)
如果不需要写COBOL程序,可直接用JCL调用DFSORT,通过OMIT COND排除匹配记录,保留不匹配的结果。
示例JCL:
//NONMATCH JOB (ACCT),'NON-MATCH RECORDS',CLASS=A,MSGCLASS=X //SORTSTEP EXEC PGM=SORT //SORTIN DD DSN=YOUR.INPUT.FILE,DISP=SHR //SORTOUT DD DSN=YOUR.OUTPUT.NONMATCH.FILE, // DISP=(NEW,CATLG,DELETE),SPACE=(CYL,(5,2),RLSE) //SYSOUT DD SYSOUT=* //SYSIN DD * SORT FIELDS=COPY // 仅过滤,不排序 OMIT COND=(1,5,CH,EQ,C'ABCDE') // 关键字在第1-5字节,字符类型匹配目标值 /*
- 数值类型关键字:把
CH换成对应格式,比如FI(全字整数)、BI(二进制)。 - 多条件排除:用
OR连接,比如OMIT COND=((1,5,CH,EQ,C'ABCDE'),OR,(1,5,CH,EQ,C'FGHIJ'))
三、如果是DB2数据库表
在COBOL程序中嵌入SQL查询,直接筛选不匹配的记录:
示例SQL语句(单目标值):
SELECT KEY_FIELD, OTHER_DATA INTO :WS-KEY, :WS-OTHER-DATA FROM YOUR_DB2_TABLE WHERE KEY_FIELD != :WS-TARGET-KEY FOR FETCH ONLY
多目标值排除:
SELECT * FROM YOUR_DB2_TABLE WHERE KEY_FIELD NOT IN ('ABCDE', 'FGHIJ', 'KLMNO')
常见问题排查
- 检查关键字段的类型匹配:字符型要注意空格填充,数值型要避免格式错误。
- 确认是否遍历了所有记录:如果之前用了匹配搜索逻辑(比如VSAM的
START+READ NEXT),只会返回匹配项,必须改成全量遍历。 - 空值处理:如果关键字段可能为空,COBOL中要判断
WS-KEY-FIELD IS SPACE(字符型)或WS-NUM-KEY IS ZERO(数值型),避免漏判。
内容的提问来源于stack exchange,提问作者Rajshree M
相关产品推荐
相关产品推荐

