如何在 JCL/汇编器中为 QSAM put-locate 正确声明 DCB
Posted
技术标签:
【中文标题】如何在 JCL/汇编器中为 QSAM put-locate 正确声明 DCB【英文标题】:How to correctly declare DCB in JCL/assembler for QSAM put-locate 【发布时间】:2011-07-16 17:51:55 【问题描述】:我正在尝试编写一个程序,该程序将使用 370/assembler 和 QSAM 将一些数据写入临时数据集。执行 put 时我得到一个 soc01。
我在汇编代码中的 DCB 声明如下所示:
TEMPFILE DCB DDNAME=TEMP, X
DEVD=DA, X
DSORG=PS, X
MACRF=PL,GL, X
RECFM=FBA, X
LRECL=25, X
BLKSIZE=3000, X
EODAD=EOF3
在 JCL 中,声明如下所示:
//TEMP DD DSN=&&TEMP,UNIT=PUB,DISP=(MOD,KEEP,DELETE),
// DCB=(LRECL=25,BLKSIZE=3000)
而 put 命令看起来像这样:
PUT TEMPFILE
MVC 0(25,1),HIGHSALE
我怀疑问题出在我的 JCL 声明中,但我没有任何运气找到任何东西。
【问题讨论】:
我将 dcb 宏的 Macrf 部分更改为 macrf=(pl,gl),显然它应该是这样写的。相反,我收到了 soc04 错误。所以宏如下。 TEMPFILE DCB DDNAME=TEMP, DEVD=DA, DSORG=PS, MACRF=(PL,GL), RECFM=FBA, LRECL=25, BLKSIZE=3000, EODAD=EOF3 /叹息;我分支了 open 指令。感谢您的帮助。 【参考方案1】:您收到的是S0C4,也就是说,您正在尝试访问不属于您的存储。假设您已经确定(从 PSW 或通过其他方式)异常指示在您的 PUT 宏扩展到的某些代码中,并且您的程序集列表中没有消息表明“没有活动使用 for...",寄存器 1 指向哪里?由于您使用的是定位模式,因此寄存器 1 必须指向您的数据。
顺便说一句,我通常不会在程序的 DCB 宏中看到块大小编码。大多数商店都使用系统确定的块大小,因此您在程序或 JCL 中都看不到它。如果您更自如地编写代码,它不会造成任何伤害。
【讨论】:
以上是关于如何在 JCL/汇编器中为 QSAM put-locate 正确声明 DCB的主要内容,如果未能解决你的问题,请参考以下文章