You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 01:00:59