我想找出在循环中从工作区修改DB表的最佳解决方案。
有几种方法可以做到这一点,首先;
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个条目,我不确定哪个是更好的方法。(我也想知道哪个条目更多,哪个更好。)
谢谢。
您的第一个示例(具有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 *
获取数据,而是只查询单个字段时,也必须使用它。
首先使用字段符号
修改循环中的数据LOOP AT ITAB ASSIGNING <WA>.
<WA>-flag = 'X'.
ENDLOOP.
我建议你使用UPDATE而不是MODIFY。
UPDATE DBTAB from TABLE ITAB.
如果你想使用Modify语句来更新数据库。
MODIFY DBTAB from ITAB.
使用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.
这通常是更好的,因为它提高了性能,并确保您只更改表中您想要更改的行。