我想找出在循环中从工作区修改数据库表的最佳解决方案。
有几种方法可以实现这一点,首先是
LOOP AT itab INTO wa.
wa-flag = 'X'.
MODIFY zblabla FROM wa.
ENDLOOP.
和字段符号;
LOOP AT ITAB ASSIGNING <WA>.
<WA>-flag = 'X'.
ENDLOOP.
或者,我应该从整个内部表修改DBtable吗?
modify zblabla from it.
我不确定哪一个是少于50个条目的更好方法。 (我也想知道哪一个更好用更多的条目。)
感谢。
答案 0 :(得分:4)
您的第一个示例(具有LOOP AT ITAB ASSIGNING <WA>
的示例)实际上并未更改数据库。它只会更改内存中的数据。但是,您可以在之后执行UPDATE zblabla FROM TABLE itab.
,将整个表一次性发送回数据库。
当表格的每一行都发生变化时,这比单独更改每一行要快得多。但是当表中只有几行实际上不同时,这非常浪费,使用MODIFY
仅更新实际更改的行可能会更快。
有时可用于更新数据库内容而无需将其加载到应用程序服务器中的另一个选项是UPDATE database_table SET field = value WHERE condition
命令。
UPDATE zblabla SET flag = 'X'.
对于数据库中表格中的每一行,都会将标记设置为“X”,甚至不需要SELECT
任何内容。
在你的例子中,这将是迄今为止最快的方法,但在现实世界中,你很少遇到如此微不足道的问题。
对于单个条目, UPDATE ... SET ... WHERE ...
也应优先于MODIFY
,因为您拥有的表格非常宽并且您没有更改大部分条目,因为它允许您指定要更改的字段。如果您没有通过SELECT *
获取数据,而是仅查询单个字段,则还必须使用它。
答案 1 :(得分:1)
首先使用字段符号
修改循环中的数据LOOP AT ITAB ASSIGNING <WA>.
<WA>-flag = 'X'.
ENDLOOP.
我建议你使用UPDATE over MODIFY。
UPDATE DBTAB from TABLE ITAB.
如果要使用Modify语句更新数据库。
MODIFY DBTAB from ITAB.
答案 2 :(得分:0)
使用transport和where子句修改内部表,以指定使用表的整个键更改哪些字段,然后使用内部表更改透明表(数据库表)。
wa_X-field1 = "something". "where wa_X is of the same type of the table e.g. has the same "fields.
wa_X-field2 = "other something".
MODIFY it_tableX FROM wa_X TRANSPORTING field1 field2 WHERE key1 = wa_X-key1 "(first key)
key2 = wa_X-key2. "(last key)
MODIFY tableX FROM TABLE it_tableX.
这通常更好,因为它可以提高性能,并确保您只更改表格中要更改的行。
希望这有帮助。