1

当我对可变长度文件进行排序时,该作业反复出现 SB37 异常。即使我增加了 SPACE 参数值,这项工作仍然在终止。

谁能帮助我知道这可能是什么原因..?

下面是我一直在尝试的 JCL。

//STEP01   EXEC PGM=SORT
//SORTIN    DD DSN=<Input DSN>,DISP=SHR   [the i/p DSN created with SPACE=(CYL,(1200,120),RLSE) ]
//SORTOUT   DD DSN=<output DSN>,DISP=(,CATLG,DELETE),
//             UNIT=DISK,SPACE=(CYL,(1200,120),RLSE),
//             DCB=(RECFM=V,LRECL=32756,DSORG=PS)
//SYSIN     DD *
  SORT FIELDS=(1,15,CH,A)
  SUM FIELDS=NONE
/*
//SYSOUT    DD  SYSOUT=*
4

4 回答 4

1

试试下面,SB37 可能是因为排序工作 DD 在动态分配时没有获得足够的空间。

/STEP01   EXEC PGM=SORT
//SORTIN    DD DSN=<Input DSN>,DISP=SHR   [the i/p DSN created with SPACE=(CYL,(1200,120),RLSE) ]
//SORTOUT   DD DSN=<output DSN>,DISP=(,CATLG,DELETE),
//             UNIT=DISK,SPACE=(CYL,(1200,120),RLSE),
//             DCB=(RECFM=V,LRECL=32756,DSORG=PS)
//SORTWK01 DD  UNIT=SYSDA,SPACE=(CYL,(500,10))
//SORTWK02 DD  UNIT=SYSDA,SPACE=(CYL,(500,10))
//SORTWK03 DD  UNIT=SYSDA,SPACE=(CYL,(500,10))
//SORTWK04 DD  UNIT=SYSDA,SPACE=(CYL,(500,10))
//SYSIN     DD *
  SORT FIELDS=(1,15,CH,A)
  SUM FIELDS=NONE
/*
//SYSOUT    DD  SYSOUT=*
于 2014-04-17T10:31:09.197 回答
0

这是我修改的 JCL 。它正在工作。

甚至,这里输入数据集的记录长度(LRECL)也是 32756。

//STEP01   EXEC PGM=SORT
//SORTIN    DD DSN=<Input DSN>,DISP=SHR   [the i/p DSN created with SPACE=(CYL,(1200,120),RLSE) ]
//SORTOUT   DD DSN=<output DSN>,DISP=(,CATLG,DELETE),
//             UNIT=DISK,SPACE=(CYL,(1200,120),RLSE),
//             DCB=(RECFM=V,LRECL=500,DSORG=PS)
//SYSIN     DD *
  SORT FIELDS=(1,15,CH,A)
  SUM FIELDS=NONE
/*
//SYSOUT    DD  SYSOUT=*
于 2014-04-18T12:19:24.173 回答
0

自从我在大型机上工作以来已经有一段时间了,但是如果内存服务于 B37 可能会出现两个基本原因:

1) 初始分配的磁盘空间不可用

2) 二次分配的磁盘空间不可用

您的 JCL 声明:

//SORTOUT   DD DSN=<output DSN>,DISP=(,CATLG,DELETE),
//             UNIT=DISK,SPACE=(CYL,(1200,120),RLSE),
//             DCB=(RECFM=V,LRECL=32756,DSORG=PS)

要求 1200 个初始气缸。这似乎有很多空间,请尝试以下操作:

//SORTOUT   DD DSN=<output DSN>,DISP=(,CATLG,DELETE),
//             UNIT=DISK,SPACE=(CYL,(12,240),RLSE),
//             DCB=(RECFM=V,LRECL=32756,DSORG=PS)

如果需要,这应该会为您提供一次主要分配,然后为每个次要分配提供 240 个柱面。

此外,查看 SB37 的确切描述,它应该描述问题是由于没有空间用于主要分配而没有空间用于辅助分配。

于 2014-04-17T23:15:54.600 回答
0

由于您打算摆脱尾随空白并且只处理最大数据长度 246,因此您应该在 SORT 中完成所有操作。

//STEP01   EXEC PGM=SORT
//SORTIN    DD DSN=<Input DSN>,DISP=SHR
//SORTOUT   DD DSN=<output DSN>,DISP=(,CATLG,DELETE),
//             UNIT=DISK,SPACE=(CYL,(1200,120),RLSE)
//SYSIN     DD *
  INREC BUILD=(1,4,5,246)
  SORT FIELDS=(5,246,CH,A)
  SUM FIELDS=NONE
  OUTFIL VLTRIM=C' '
//SYSOUT    DD  SYSOUT=*

请注意,我已从 SORTOUT 中删除了 DCB 信息。SORT 会解决这个问题,您可以通过在 SORT 步骤中将其包含在 SORTOUT(或来自 OUTFIL 的任何 DD)中来混淆和增加维护。

在 INREC 中,从输入中创建一条新记录,该记录长 250 字节(四个字节的 RDW 和 246 字节的数据)。RDW 和数据是分开提到的,这样下一个人就很清楚你知道你在做什么(也许你真的想要 250 字节的数据?)。

这样,您不想要的所有数据都不会进入 SORT 本身,从而大大减少了您的工作空间需求,减少了 CPU 时间和运行时间。

除非您的数据有一个实际的键(在位置 5,长度为 11),否则您可能会将非重复数据视为重复数据。如果您没有密钥,SORT 现在会对数据进行排序。甚至不再需要对 RDW 进行远程排序,因为由于 INREC 上的 BUILD,所有 RDW 将在前两个字节中包含 250(二进制)的记录长度。

现在SUM FIELDS=NONE将对 246 字节的数据进行重复数据删除。

In OUTFIL,VLTRIM=C' '用于删除碰巧留下的任何尾随空格。

担心你不确定你的实际记录长度,我会运行这样的东西:

  INREC BUILD=(1,4,1,2) 

  SORT FIELDS=(5,2,BI,A) 

  OUTREC OVERLAY=(5:5,2,BI,EDIT=(IIIIT),10:18X)

  OUTFIL NODETAIL, 
         REMOVECC, 
         HEADER2=('RECLENS PRESENT ON FILE'), 
         SECTIONS=(5,5, 
             TRAILER3=(5,5)), 
         TRAILER1=('MIN/MAX ', 
             MIN=(5,5,ZD,EDIT=(IIIIT)), 
             ' ', 
             MAX=(5,5,ZD,EDIT=(IIIIT))) 

这将生成一个简单的文件,显示所有记录长度,并在最后一页显示最小值/最大值。

INREC 用于制作仅包含(二进制)记录长度的记录。然后对这些进行排序。OUTREC 将二进制记录长度扩展为五个可打印数字,并抑制前导零。使用了 OUTFIL 报告功能:抑制明细行,不包含打印控制代码,在每个“页面”的顶部打印标题,在格式化的记录长度上建立控制中断,记录长度为中断发生时打印。最后,打印最小值和最大值。

如果您使用包含以下内容的 SORT 步骤为此创建输入:

选项复制OUTFIL VLTRIM=C''

然后,一旦忽略尾随空格,您将获得文件记录长度的报告,并且可以确信(对于该数据示例)您所知道的规范与数据匹配。

于 2014-04-18T16:09:17.887 回答