ABAP INDX-like类型
类INDX表结构
当存储数据簇在数据库表和共享内存的应用buffers(参见:ABAP数据簇),必须指定数据表为如下的结构:
-
第一个字段必须MANDT,键
-
第二个字段必须RELID,键,char2,存储行区
-
之后,任意名字段字,键,char1, 它将id中指定的标识符存储在关键字段的长度中
-
下个字段必须是SRTF2,键,INT4,包含了簇中数据的行数,系统自动填充。
-
然后任意多个自由定义的字段,这些会被From wa指定值,附加到wa用IMPORT语句导出。
-
最后两个字段必须是CLUSTR和LCLUSTID,INT2和LRAW类型,CLUSTR包含数簇的长度,CLUSTD包含实际的数据簇。
-
在SRTF2和CLUSTR中间被定义的字段可用来存储数据簇状态信息,比如data,user,或者language
例:
系统表 INDX:

INDX-Like Database Table

类INDX表是关系型数据表,在ABAP数据字典中定义,这意味着原则上来说,(Open)SQL语句也可以用来访问类INDX数据库表。
为了在类INDX数据库表高效的使用SQL语句,你必须视这些数据库表为特殊的结构。
-
出于读或者写的原因访问字段CLUSTR和CLUSTD不是一个好的主意,这些字段以内部的格式包含在数据簇中,他们只能够使用EXPORT TO DATABASE和IMPORT FROM DATABASE语句来正确的使用。
-
永远不要使用SQL语句INSERT在类INDX数据库表。
-
在紧急情况,OPEN SQL语句可以用来管理操作类INDX数据库表。
例:
对于特定的数据簇使用SELECT,类INDX表可以被系统的查询;同时,在自定义的列可以作为查询条件。下面的例子从数据库表的一个存储区域删除了所有的特定用户的数据簇,每次,数据簇的所有行被删除。
DATA indx_wa TYPE demo_indx_table. SELECT SINGLE * FROM demo_indx_table INTO indx_wa WHERE relid = ... AND srtf2 = 0 AND userid = sy-uname. DELETE FROM DATABASE demo_indx_table(...) ID indx_wa-id.
例:
下面的例子展示了,如何使用UPDATE修改数据库表DEMO_INDX_TABLE中的数据簇的标识和区域,使用特定的数据簇语句解决这个问题相当的消耗时间。
UPDATE demo_indx_table SET relid = new_relid id = new_id WHERE relid = old_relid AND id = old_id.