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

ABAP查询报错‘LT_MARC工作区长度不足’,如何解决?

解决ABAP中“工作区'LT_MARC'长度不足”报错及CL_SQL_STATEMENT执行问题

一、“工作区长度不足”报错原因及修复

你的SELECT语句对MARC和MARA做了内连接,查询结果包含两个表的所有字段,但目标内表lt_marc仅定义为MARC结构的表,其长度远小于JOIN后的结果集,因此触发长度不匹配报错。

修复方案分两种场景:

  • 若仅需MARC表字段:修改SELECT语句,明确选取MARC的字段
    DATA: lt_marc TYPE STANDARD TABLE OF marc.
    
    SELECT mc~* FROM marc AS mc 
        INNER JOIN mara AS mm 
            ON mm~matnr = mc~matnr
        INTO TABLE lt_marc 
        WHERE mm~laeda >= 20230801.
    
  • 若需两个表的字段:定义包含MARC和MARA结构的复合内表
    TYPES: BEGIN OF ty_marc_mara,
              INCLUDE TYPE marc,
              INCLUDE TYPE mara,
          END OF ty_marc_mara.
    DATA: lt_marc_mara TYPE STANDARD TABLE OF ty_marc_mara.
    
    SELECT mc~* mm~* FROM marc AS mc 
        INNER JOIN mara AS mm 
            ON mm~matnr = mc~matnr
        INTO TABLE lt_marc_mara 
        WHERE mm~laeda >= 20230801.
    

二、CL_SQL_STATEMENT执行失败的原因及解决

RSDU_EXEC_SQL是ADBC的封装工具,会动态处理查询结果,无需预先匹配固定结构,因此能成功执行JOIN语句。而CL_SQL_STATEMENT的execute_query方法如果绑定到固定结构变量(如MARC类型),同样会因结果集长度不匹配报错。

解决办法:

  • 方式1:使用动态结果集处理,无需预先定义结构
    DATA(lo_sql) = cl_sql_statement=>create( ).
    DATA(lo_result) = lo_sql->execute_query(
      `SELECT mc~*, mm~* FROM marc AS mc INNER JOIN mara AS mm ON mm~matnr = mc~matnr WHERE mm~laeda >= '20230801'`
    ).
    DATA(lt_columns) = lo_result->get_column_names( ).
    DATA(ls_row) TYPE string_table.
    WHILE lo_result->next( ) = abap_true.
      lo_result->get_row( IMPORTING data = ls_row ).
      " 按需处理每行数据
    ENDWHILE.
    lo_result->close( ).
    
  • 方式2:绑定复合结构变量,匹配JOIN后的结果集
    TYPES: BEGIN OF ty_marc_mara,
              INCLUDE TYPE marc,
              INCLUDE TYPE mara,
          END OF ty_marc_mara.
    DATA: ls_result TYPE ty_marc_mara.
    
    DATA(lo_sql) = cl_sql_statement=>create( ).
    DATA(lo_result) = lo_sql->execute_query(
      `SELECT mc~*, mm~* FROM marc AS mc INNER JOIN mara AS mm ON mm~matnr = mc~matnr WHERE mm~laeda >= '20230801'`
    ).
    lo_result->set_param( DATA(ls_result) ).
    WHILE lo_result->next( ) = abap_true.
      lo_result->get_data( ).
      " 处理ls_result中的数据
    ENDWHILE.
    lo_result->close( ).
    

内容的提问来源于stack exchange,提问作者Priyanka Mishra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:52:46