从 COBOL mainprog 调用 COBOL/DB2 subprog 从 subprog 的编译单元返回 CEE3204S 错误

Posted

技术标签:

【中文标题】从 COBOL mainprog 调用 COBOL/DB2 subprog 从 subprog 的编译单元返回 CEE3204S 错误【英文标题】:Calling COBOL/DB2 subprog from COBOL mainprog returns a CEE3204S error from compile unit of subprog 【发布时间】:2021-10-05 05:33:28 【问题描述】:

我正在尝试从 COBOL 主程序调用 COBOL/DB2 子程序。但是在运行时,它会返回此错误:

CEE3204S The system detected a protection exception (System Completion Code=0C4).
From compile unit ABCDBQUE...

这是我从 mainprog 调用 subprog 的方式:

       01  WS-HOST-VARIABLES.
           05 WS-ACCT-NO.
              10 WS-REGN-CODE            PIC X(04).
              10 WS-BRANCH-CODE          PIC X(04).
              10 WS-ACCOUNT-NO           PIC X(08).
           05 WS-HOST-ACCT-NO            PIC X(16).
           05 WS-ACCT-STATUS.
              10 WS-DORMANT-STATUS       PIC X(03) VALUE '002'.
              10 WS-CLOSED-STATUS        PIC X(03) VALUE '004'.
       01  WS-DB-QUERY                   PIC X(20).
       01  WS-DB-QUERY-STATUS            PIC X(01).
           88 DB-QUERY-SUCCEEDED         VALUE 'S'.
           88 DB-QUERY-FAILED            VALUE 'F'.
..........
       01  WS-PRT-LINE3.
           05 FILLER                     PIC X(10) VALUE ' REGION:  '.
           05 WS-PRT-REGION-NAME         PIC X(70).
       01  WS-PRT-LINE4.
           05 FILLER                     PIC X(10) VALUE ' BRANCH:  '.
           05 WS-PRT-BRANCH-NAME         PIC X(70).
..........
       0810-GET-REGION-AND-BRANCH.
           MOVE 'GET REGION BRANCH' TO WS-DB-QUERY
           CALL 'ABCDBQUE' USING WS-DB-QUERY
                                 WS-DB-QUERY-STATUS 
                                 WS-REGN-CODE 
                                 WS-BRANCH-CODE 
                                 WS-ACCOUNT-NO 
                                 WS-PRT-REGION-NAME
                                 WS-PRT-BRANCH-NAME.
           EVALUATE TRUE 
               WHEN DB-QUERY-SUCCEEDED
                    DISPLAY 'GET REGION BRANCH SUCCEEDED'
               WHEN DB-QUERY-FAILED
                    DISPLAY 'GET REGION BRANCH FAILED'
           END-EVALUATE.

这是我的子程序的样子:

       WORKING-STORAGE SECTION.
............
      *
       LINKAGE SECTION. 
       01  LS-DB-QUERY                   PIC X(20).
           88 DB-SELECT-ACCT             VALUE 'INQUIRE DEPTABLE'.
           88 DB-SELECT-REG-BRANCH       VALUE 'GET REGION BRANCH'.
           88 DB-UPDATE                  VALUE 'ACCT STATUS UPDATE'.
       01  LS-DB-QUERY-STATUS            PIC X(01).
           88 DB-QUERY-SUCCEEDED         VALUE 'S'.
           88 DB-QUERY-FAILED            VALUE 'F'.
       01  LS-ACCT-NO.
           05 LS-REGN-CODE               PIC X(04).
           05 LS-BRANCH-CODE             PIC X(04).
           05 LS-ACCOUNT-NO              PIC X(08).
       01  LS-PRT-REGION-NAME            PIC X(70).
       01  LS-PRT-BRANCH-NAME            PIC X(70).
      *
       PROCEDURE DIVISION USING LS-DB-QUERY, 
                                LS-DB-QUERY-STATUS,
                                LS-ACCT-NO,
                                LS-PRT-REGION-NAME,
                                LS-PRT-BRANCH-NAME.
..........

编译两个程序的返回代码都是0。当我没有将subprog与mainprog分开时,它可以成功运行。但是当我开始添加这个静态调用功能时失败了。

【问题讨论】:

【参考方案1】:

CALL 上,您传递了 7 个参数,但您只有 USING 5 - 那是行不通的。调用程序和被调用程序中的参数列表必须完全匹配。

【讨论】:

谢谢。运行 COBOL 主程序时,我应该使用运行 COBOL/DB2 程序的 jcl,因为子程序是 COBOL/db2,还是使用运行 COBOL 程序的 JCL 运行它就足够了? 您必须在 DB2 中使用 JCL,否则无法建立连接。 我使用 cobol/db2 编译器编译了 mainprog(COBOL) subprog(COBOL/DB2),也绑定了两者,然后使用 JCL 和 DB2 运行 mainprog。返回码为 0,但根据我的输出文件,运行 mainprog 似乎无法调用 subprog。我在编译/绑定/运行过程中做错了吗? 我认为按原样回答是不正确的。 COBOL 通常允许“额外”参数——它们只是未被使用,不是吗?我看到的问题是参数不匹配,我认为只要将WS-REGN-CODE WS-BRANCH-CODE ACCOUNT-NO 替换为WS-ACCT-NO,它应该可以工作,即使最后添加了更多参数。

以上是关于从 COBOL mainprog 调用 COBOL/DB2 subprog 从 subprog 的编译单元返回 CEE3204S 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在 COBOL 中从面板 (ISPF) 呼叫、发送和接收信息

在COBOL中,是不是可以递归调用一个段落?

COBOL中识别程序调用子模块

cobol和C的数据类型对应,谁知道?详细点

COBOL 中的 CICS 程序堆栈

多个 Cobol 子程序可以在同一个模块中吗