OpenSQL IN操作数的正确类型:内表作为宿主变量的使用问题
解决OpenSQL中内表作为IN条件宿主变量的结构问题
这个报错的核心原因很明确:OpenSQL要求用于IN操作的内表宿主变量,必须是单字段结构的内表,而不是单纯的基本类型(比如string)内表。你之前用的my_values是TYPE STANDARD TABLE OF string这种基本类型内表,不符合OpenSQL对IN条件内表的结构要求,所以才会报"table has wrong row structure"的错误。
下面给你两种直接解决的方案,都能避免循环:
方案1:转换现有内表为符合要求的结构内表
如果不想修改my_values的原始定义,可以先创建一个匹配数据库字段类型的单字段结构,再把原内表的数据转进去:
- 定义结构和内表类型(注意字段类型要和
Z_MYTAB-my_col完全匹配,避免隐式转换问题):
TYPES: BEGIN OF ty_filter_entry, col_value TYPE Z_MYTAB-my_col, " 和数据库字段类型保持一致 END OF ty_filter_entry. TYPES: tt_filter_entries TYPE STANDARD TABLE OF ty_filter_entry WITH EMPTY KEY.
- 把你的
my_values字符串内表转换成这个结构内表:
DATA(lt_filter) = VALUE tt_filter_entries( FOR val IN my_values ( col_value = val ) ).
- 用转换后的内表执行查询:
SELECT * FROM Z_MYTAB WHERE my_col IN @lt_filter INTO TABLE @DATA(my_rows).
方案2:直接定义符合要求的内表(推荐)
如果可以控制my_values的声明,直接一开始就定义成单字段结构内表,省去转换步骤:
TYPES: BEGIN OF ty_filter_entry, col_value TYPE Z_MYTAB-my_col, END OF ty_filter_entry. TYPES: tt_filter_entries TYPE STANDARD TABLE OF ty_filter_entry WITH EMPTY KEY. " 直接用这个类型声明你的my_values DATA(my_values) = VALUE tt_filter_entries( ( col_value = 'foo' ) ( col_value = 'bar' ) ). " 直接执行查询即可 SELECT * FROM Z_MYTAB WHERE my_col IN @my_values INTO TABLE @DATA(my_rows).
额外提示
- 一定要保证结构内表的字段类型和数据库字段
my_col的类型、长度完全兼容,否则可能出现隐式转换导致的匹配错误(比如固定长度CHAR字段和STRING类型的截断问题)。 - 这种单字段结构内表的要求是ABAP OpenSQL的规范,不管是7.40以上的新语法还是旧语法都适用。
内容的提问来源于stack exchange,提问作者guettli
相关产品推荐
相关产品推荐

