[英]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.
這導致轉儲,並顯示以下消息:
運行時錯誤:DBIF_RSQL_INVALID_CURSOR
異常: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.
如果你的表有復合主鍵,即多列如{MANDT,GJAHR,BELNR},只需將from
和to
字段的類型替換為結構,並調整第一個SELECT中的列列表和第二個SELECT中的WHERE條件適當地選擇。
如果您的范圍僅包含option = '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 的外鍵表中獲取范圍選擇的每個值。 然后你遍歷結果表並像上面一樣在里面執行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.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.