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
相关产品推荐
相关产品推荐

