Easytrieve Plus与Db2:读取文件匹配Db2表报错求助
EZTPA00批处理匹配DB2表报错(SQLCODE -104)解决及示例
错误原因分析
SQLCODE -104(SQLSTATE 42601)提示的非法符号?,实际是EZTPA00将代码中直接引用的文件字段INFILE1:TEMPLATE转换后的占位符。DB2 SQL预编译阶段无法识别这种外部文件的直接引用,必须通过**宿主变量(工作区变量)**传递文件读取的值。
原代码核心错误:
- 在SQL游标声明中直接使用
INFILE1:TEMPLATE作为查询条件,未先将文件记录读取到工作区变量 - 游标声明与JOB INPUT循环的逻辑顺序错误,应该在循环内针对每条记录动态执行查询
可行实现示例
以下是完整的批处理代码示例,实现从输入文件读取模板号,匹配DB2表并输出结果:
LIST ON PARM SSID('DB2G') FILE INFILE1 VB (133 6233) IP-REC 01 133 A TEMPLATE 01 015 A FILE OUFILE1 FB (100 1000) OP-REC 01 100 A COMMUN_TRANS_ID 01 040 A COMMUN_TEMPLATE_NO 42 015 A * 定义工作区变量:存储输入模板号、DB2查询结果 DEFINE WS-TEMPLATE W 015 A DEFINE WS-TRANS-ID W 040 A * 主处理循环:逐条读取输入文件 JOB INPUT(INFILE1) + START 010-PROCESS-RECORD + FINISH 999-CLEANUP * 处理单条记录 010-PROCESS-RECORD: * 将当前文件记录的模板号存入工作区变量 MOVE INFILE1:TEMPLATE TO WS-TEMPLATE * 声明游标:使用宿主变量作为查询条件 SQL DECLARE C1 CURSOR FOR + SELECT COMMUN_TRANS_ID, COMMUN_TEMPLATE_NO + FROM VMUSIU.E_COMM_DLVY WHERE + COMMUN_TEMPLATE_NO = :WS-TEMPLATE * 执行查询 SQL OPEN C1 DO WHILE SQLCODE NE +100 SQL FETCH C1 + INTO :WS-TRANS-ID, :WS-TEMPLATE IF SQLCODE NE 0 DISPLAY 'ERROR: SQLCODE = ' SQLCODE ' FOR TEMPLATE: ' WS-TEMPLATE * 遇到错误不终止,继续处理下一条记录 GO TO 010-CLOSE-CURSOR END-IF * 将查询结果写入输出文件 MOVE WS-TRANS-ID TO OUFILE1:COMMUN_TRANS_ID MOVE WS-TEMPLATE TO OUFILE1:COMMUN_TEMPLATE_NO WRITE OUFILE1 010-CLOSE-CURSOR: SQL CLOSE C1 GO TO JOB-NEXT * 收尾处理 999-CLEANUP: DISPLAY 'PROCESSING COMPLETE' STOP
关键注意事项
- 所有SQL中引用的外部值必须使用宿主变量(格式
:变量名),不能直接引用文件字段 - 游标声明应放在JOB INPUT循环内,确保每条记录都能基于当前模板号执行查询
- 错误处理逻辑可根据需求调整(示例中遇到SQL错误仅打印信息,继续处理后续记录)
内容的提问来源于stack exchange,提问作者Patricia Flickner
相关产品推荐
相关产品推荐

