SAP ABAP如何进行海量选择
How to make massive selection SAP ABAP
我正在从数据库中进行大量选择,目的是将其保存在应用程序服务器或本地目录中。
由于数据库中有大量条目,我首先尝试了这种方式:
SELECT * FROM db PACKAGE SIZE iv_package
INTO CORRESPONDING FIELDS OF TABLE rt_data
WHERE cond IN so_cond
AND cond1 IN so_cond1.
SAVE(rt_data).
ENDSELECT.
这导致转储,并显示以下消息:
Runtime Errors: DBIF_RSQL_INVALID_CURSOR
Exeption : CX_SY_OPEN_SQL_DB
我也尝试过另一种方法:
OPEN CURSOR WITH HOLD s_cursor FOR
SELECT * FROM db
WHERE cond IN so_cond
AND cond1 IN so_cond1.
DO.
FETCH NEXT CURSOR s_cursor INTO TABLE rt_data PACKAGE SIZE iv_package.
SAVE(rt_data).
ENDDO.
这也导致了包含相同消息的转储。
这种情况的最佳方法是什么?
TYPES:
BEGIN OF key_package_type,
from TYPE primary_key_type,
to TYPE primary_key_type,
END OF key_package_type.
TYPES key_packages_type TYPE STANDARD TABLE OF key_package WITH EMPTY KEY.
DATA key_packages TYPE key_packages_type.
* select only the primary keys, in packages
SELECT primary_key_column FROM db
INTO TABLE @DATA(key_package) PACKAGE SIZE package_size
WHERE cond IN @condition AND cond1 IN other_condition
ORDER BY primary_key_column.
INSERT VALUE #( from = key_package[ 1 ]-primary_key_column
to = key_package[ lines( key_package ) ]-primary_key_column )
INTO TABLE key_packages.
ENDSELECT.
* select the actual data by the primary key packages
LOOP AT key_packages INTO key_package.
SELECT * FROM db INTO TABLE @DATA(result_package)
WHERE primary_key_column >= key_package-from
AND primary_key_column <= key_package-to.
save_to_file( result_package ).
ENDLOOP.
如果您的 table 具有复合主键,即多列,例如 {MANDT、GJAHR、BELNR},只需将 from
和 to
字段的类型替换为结构并适当调整第一个 SELECT 中的列列表和第二个 SELECT 中的 WHERE 条件。
如果您的范围仅包含 option = 'EQ'
条记录或其中一个条件具有外键,您可以在执行 select 之前简单地开始循环以减小结果 table 并将方法调用移出打开的游标。
选项 = 'EQ'
在这里你只是在范围内循环:
LOOP AT so_cond ASSIGNING FIELD-SYMBOL(<cond>).
SELECT * FROM db
INTO CORRESPONDING FIELDS OF TABLE rt_data
WHERE cond = <cond>-low.
AND cond1 IN so_cond1.
save(rt_data).
ENDLOOP.
外键
在这种情况下无法在范围内循环,因为您无法轻松解决 CP
等其他选项。但是您可以从 cond 的外键表中获取 selects 范围内的每个值。然后你遍历结果 table 并像上面一样在里面做 SELECT
语句。
SELECT cond FROM cond_foreign_keytab
WHERE cond IN @so_cond
INTO TABLE @DATA(cond_values).
LOOP AT cond_values ASSIGNING FIELD-SYMBOL(<cond>).
SELECT * FROM db
INTO CORRESPONDING FIELDS OF TABLE rt_data
WHERE cond = <cond>.
AND cond1 IN so_cond1.
save(rt_data).
ENDLOOP.
我正在从数据库中进行大量选择,目的是将其保存在应用程序服务器或本地目录中。 由于数据库中有大量条目,我首先尝试了这种方式:
SELECT * FROM db PACKAGE SIZE iv_package
INTO CORRESPONDING FIELDS OF TABLE rt_data
WHERE cond IN so_cond
AND cond1 IN so_cond1.
SAVE(rt_data).
ENDSELECT.
这导致转储,并显示以下消息:
Runtime Errors: DBIF_RSQL_INVALID_CURSOR
Exeption : CX_SY_OPEN_SQL_DB
我也尝试过另一种方法:
OPEN CURSOR WITH HOLD s_cursor FOR
SELECT * FROM db
WHERE cond IN so_cond
AND cond1 IN so_cond1.
DO.
FETCH NEXT CURSOR s_cursor INTO TABLE rt_data PACKAGE SIZE iv_package.
SAVE(rt_data).
ENDDO.
这也导致了包含相同消息的转储。
这种情况的最佳方法是什么?
TYPES:
BEGIN OF key_package_type,
from TYPE primary_key_type,
to TYPE primary_key_type,
END OF key_package_type.
TYPES key_packages_type TYPE STANDARD TABLE OF key_package WITH EMPTY KEY.
DATA key_packages TYPE key_packages_type.
* select only the primary keys, in packages
SELECT primary_key_column FROM db
INTO TABLE @DATA(key_package) PACKAGE SIZE package_size
WHERE cond IN @condition AND cond1 IN other_condition
ORDER BY primary_key_column.
INSERT VALUE #( from = key_package[ 1 ]-primary_key_column
to = key_package[ lines( key_package ) ]-primary_key_column )
INTO TABLE key_packages.
ENDSELECT.
* select the actual data by the primary key packages
LOOP AT key_packages INTO key_package.
SELECT * FROM db INTO TABLE @DATA(result_package)
WHERE primary_key_column >= key_package-from
AND primary_key_column <= key_package-to.
save_to_file( result_package ).
ENDLOOP.
如果您的 table 具有复合主键,即多列,例如 {MANDT、GJAHR、BELNR},只需将 from
和 to
字段的类型替换为结构并适当调整第一个 SELECT 中的列列表和第二个 SELECT 中的 WHERE 条件。
如果您的范围仅包含 option = 'EQ'
条记录或其中一个条件具有外键,您可以在执行 select 之前简单地开始循环以减小结果 table 并将方法调用移出打开的游标。
选项 = 'EQ'
在这里你只是在范围内循环:
LOOP AT so_cond ASSIGNING FIELD-SYMBOL(<cond>).
SELECT * FROM db
INTO CORRESPONDING FIELDS OF TABLE rt_data
WHERE cond = <cond>-low.
AND cond1 IN so_cond1.
save(rt_data).
ENDLOOP.
外键
在这种情况下无法在范围内循环,因为您无法轻松解决 CP
等其他选项。但是您可以从 cond 的外键表中获取 selects 范围内的每个值。然后你遍历结果 table 并像上面一样在里面做 SELECT
语句。
SELECT cond FROM cond_foreign_keytab
WHERE cond IN @so_cond
INTO TABLE @DATA(cond_values).
LOOP AT cond_values ASSIGNING FIELD-SYMBOL(<cond>).
SELECT * FROM db
INTO CORRESPONDING FIELDS OF TABLE rt_data
WHERE cond = <cond>.
AND cond1 IN so_cond1.
save(rt_data).
ENDLOOP.