COBOL程序已添加STOP RUN仍触发IGZ0037S错误:流程超出程序最后一行问题排查求助
IGZ0037S错误(已添加终止语句仍触发) 先看你提供的程序代码和错误输出:
你的程序代码
IDENTIFICATION DIVISION. PROGRAM-ID. DBNULLA. DATA DIVISION. WORKING-STORAGE SECTION. EXEC SQL INCLUDE SQLCA END-EXEC. EXEC SQL INCLUDE PATIENT END-EXEC. PROCEDURE DIVISION. MAIN-PARA. DISPLAY 'SAMPLE STRUCTURE OF COBOL DB2 PRORGRAM'. DISPLAY 'WE ARE CHECKING NULL HERE '. MOVE 100 TO PAT-ID. EXEC SQL SELECT PAT_ID,PAT_NAME,WARD_NAME INTO :PAT-ID,:PAT-NAME, :WARD-NAME FROM PATIENT WHERE PAT_ID = :PAT-ID END-EXEC. IF SQLCODE = 0 DISPLAY 'HI' ELSE DISPLAY 'EMBEDDED SQL SQLCODE:' SQLCODE END-IF. STOP-RUN.
程序输出
SAMPLE STRUCTURE OF COBOL DB2 PRORGRAM
WE ARE CHECKING NULL HERE
HI
IGZ0037S The flow of control in program DBNULLA proceeded beyond the last line of the program. From compile unit DBNULLA at entry point DBNULLA at compile unit offset +000006E4 at entry offset +000006E4 at address 1E5016E4.
错误原因分析
你遇到的IGZ0037S错误核心原因是程序流程没有遇到有效的终止语句。虽然你写了STOP-RUN,但COBOL语法中正确的终止语句写法是STOP RUN(空格分隔),带连字符的STOP-RUN属于无效语法,大多数COBOL编译器会直接忽略它。
这就导致程序执行完IF分支的DISPLAY 'HI'后,继续走到MAIN-PARA的末尾,再走到PROCEDURE DIVISION的最后一行,最终触发“流程超出程序最后一行”的错误。
另外,你程序里的PRORGRAM拼写错误(应该是PROGRAM)不影响程序执行,但最好修正以保持代码规范。
修复方案
只需要修改终止语句的写法,把STOP-RUN.改成STOP RUN.即可,同时可以优化代码可读性:
IDENTIFICATION DIVISION. PROGRAM-ID. DBNULLA. DATA DIVISION. WORKING-STORAGE SECTION. EXEC SQL INCLUDE SQLCA END-EXEC. EXEC SQL INCLUDE PATIENT END-EXEC. PROCEDURE DIVISION. MAIN-PARA. DISPLAY 'SAMPLE STRUCTURE OF COBOL DB2 PROGRAM'. // 修正拼写错误 DISPLAY 'WE ARE CHECKING NULL HERE '. MOVE 100 TO PAT-ID. EXEC SQL SELECT PAT_ID,PAT_NAME,WARD_NAME INTO :PAT-ID,:PAT-NAME, :WARD-NAME FROM PATIENT WHERE PAT_ID = :PAT-ID END-EXEC. IF SQLCODE = 0 DISPLAY 'HI' ELSE DISPLAY 'EMBEDDED SQL SQLCODE:' SQLCODE END-IF. STOP RUN. // 修正为正确的终止语句写法
将IF语句拆分成多行,既能提升可读性,也能避免潜在的语法歧义问题。
额外验证点
如果修改后仍然出现错误,可以检查以下两点:
- 确保
SQLCA的INCLUDE语句正确加载了SQL通讯区,SQLCODE能被编译器正确识别 - 确认程序编译时没有其他警告或错误,部分编译器会忽略无效语句但不提示警告
内容的提问来源于stack exchange,提问作者Rahul

