ABAP OPEN SQL裏OPEN CURSOR和SELECT的比較

OPEN CURSOR

After the OPEN CURSOR statement, the database cursor is positioned in front of the first line of the result set.數據庫

FETCH

This statement extracts the requested rows (using the addition INTO or APPENDING) from the results set of the database cursor from the current cursor position and assigns these rows to the data objects specified in the results set. If an internal table is specified after INTO or APPENDING, then either all rows are extracted, or as many as specified in the addition PACKAGE SIZE. The statement FETCH moves the position of the database cursor by the amount of extracted lines to the next line to be extracted.測試

我寫了一個很簡單的report 驗證:ui

Source code:this

OPEN CURSOR lv_cursor FOR SELECT product_guid FROM comm_product.

FETCH NEXT CURSOR lv_cursor INTO TABLE lt_selection PACKAGE SIZE size.

Size = 1: 此時從ST05裏觀察到表COMM_PRODUCT裏總共被掃描的記錄數量是1447.code

第二次以size = 100執行,PREPARE和OPEN直接變成REOPEN,可是recs仍然是1447.ci

對ST05裏的字段Recs按F1,查看說明:it

這個1447是怎麼來的呢?由於我OPEN CURSOR時候沒有指定任何條件,因此在OPEN CURSOR時,DB把整個product表的全部記錄視爲一個結果集,而後只返回指定package size的條數。io

因此ST05裏面看到的這個Recs是指知足OPEN CURSOR 指定條件的記錄的個數,並非最後返回給ABAP層的記錄的個數。table

而在個人測試系統裏,表COMM_PRODUCT總共就包含1447條記錄。class

而後我再生成3個新的product,COMM_PRODUCT裏面就有1450條entry。

重複執行測試report。ST05發現被掃描的記錄數變成了1450,證實咱們的結論是正確的。

再作一個驗證:表COMM_PRODUCT裏面有prefix爲JERRY06152012開頭的3條記錄:

修改上述的測試report,添加一個WHERE查詢條件:

OPEN CURSOR lv_cursor FOR SELECT product_guid FROM comm_product

WHERE product_id LIKE 'JERRY06152012%'.

第一次執行size = 1

Recs變成3了,由於匹配OPEN CURSOR條件的確實只有3條記錄

Size = 100, ST05結果和size = 1徹底一致,都是3.

結論

WebClient UI上的Maximum Number of Results(簡稱Max hit)不能控制每次OPEN CURSOR去DB查找記錄的條數,這個條數是由OPEN CURSOR後面跟的WHERE CONDITION決定的。Max hit只能控制OPEN CURSOR的WHERE CONDITION 所決定出的結果集裏,到底有多少條返回給ABAP。

Through the verification above, this understanding is wrong.

OPEN SQL的select還有一個功能是UP TO XX ROWS.

用下面的代碼測試:

SELECT product_guid INTO CORRESPONDING FIELDS OF TABLE lt_line FROM comm_product UP TO num ROWS.

Num = 1

Num = 143

說明SELECT UP TO XX ROWS是能夠控制數據庫表裏到底有多少條記錄被處理的。

但SELECT UP TO XX ROWS不能像OPEN CURSOR那樣可以在WHILE循環裏面反覆執行,它不具有像OPEN CURSOR那樣的機制,使得其可以記住當前正在操做的記錄在結果集裏的位置。

要獲取更多Jerry的原創技術文章,請關注公衆號"汪子熙"或者掃描下面二維碼:

相關文章
相關標籤/搜索