PL / I - 如何在循环中读取文件而不多次打开/关闭文件

时间:2016-09-16 13:30:58

标签: loops logic mainframe pl-i

我有一个正在读取文件的程序(FILE1)。对于FILE1中的每个记录,它都会获得字段' A'并且它通过FILE2搜索以找到具有匹配值field' B'的记录。当A = B时,读出两个文件中的一些字段。该程序目前正在使用如下代码。但是,问题是我在一个循环中多次打开和关闭FILE2。我在没有打开循环内的文件的情况下尝试了这个但是如果我这样做,我会重复记录,因为正在从上一次搜索停止的地方读入FILE2。每当我从FILE1读取新记录时,有什么方法可以指向File2的开头?代码如下:

READ FILE(FILE1) INTO (IN_LAYOUT);
    DO WHILE (MORE_RECS1);
       OPEN FILE(FILE2);
       READ FILE(FILE2) INTO (IN_LAYOUT2);
       MORE_RECS2 = '1'B;
              DO WHILE (MORE_RECS2);
                 IF (A = B) THEN
                  DO;
                     VAL = VAL2;
                     WRITE FILE (OUFILE) FROM (OUT_LAYOUT);
                     S_MORE_RECS2 = '0'B;
                     CLOSE FILE(FILE2);
                  END; /* ENDIF */
                  ELSE READ FILE(FILE2) INTO (IN_LAYOUT2);
              END; /* INNER DOWHILE */
       READ FILE(FILE1) INTO (IN_LAYOUT);
    END; 

2 个答案:

答案 0 :(得分:2)

这看起来像匹配合并。首先尝试按照您匹配的键对文件进行排序。

至少有一些大型机排序实用程序内置了此匹配合并功能,例如Syncsort具有JOIN运算符。我确定DFSORT也具备此功能。

答案 1 :(得分:1)

在这种情况下,@cschneid答案是最好的解决方案。为了完整性,还有其他解决方案:

  1. 对密钥上的2个输入文件进行排序,并在程序中进行合并
  2. 将File2加载到VSAM文件中并执行索引查找
  3. 排序合并处理

    如果您对键上的2个输入文件进行排序,则可以执行以下操作:

    DO WHILE (MORE_RECS1 and MORE_RECS2);
       if (key_file1 < key_file2) then do;
          READ FILE(FILE1) INTO (IN_LAYOUT);
       end; else if (key_file1 > key_file2) then do;
          READ FILE(FILE2) INTO (IN_LAYOUT2);
       end; else do;
          VAL = VAL2;
          WRITE FILE (OUFILE) FROM (OUT_LAYOUT);
          READ FILE(FILE1) INTO (IN_LAYOUT);
       end;
    end;
    

    当逻辑要复杂排序时使用它是有意义的(例如你 需要DB查找

    将File2加载到VSAM文件

    另一种方法是将File2加载到VSAM文件中并执行键控读取。 这有助于避免多次进行昂贵的数据库查找 (特别是对于不如DB2灵活的IMS)。

    在大多数情况下,上面的Sort-Merge处理将比VSAM查找更快。