如何在 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的主要内容,如果未能解决你的问题,请参考以下文章

如何在 jQuery 日期选择器中为禁用日期添加工具提示?

如何在 GraphQL 突变/解析器中为每个用户创建和停止唯一的计时器

X.86 X64 汇编器中的正确堆栈操作

arm gnu 汇编器中的 IMPORT 替代品是啥?

如何在卸载作业中为分隔符编写 DB2 SELECT 语句

在 z/OS Assembler 中,我可以读取 JCL 输入流两次吗?