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 驗證:
Source code:
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.
第二次以size = 100執行,PREPARE和OPEN直接變成REOPEN,但是recs仍然是1447.
對ST05裡的欄位Recs按F1,檢視說明:
這個1447是怎麼來的呢?因為我OPEN CURSOR時候沒有指定任何條件,所以在OPEN CURSOR時,DB把整個product表的所有記錄視為一個結果集,然後只返回指定package size的條數。
所以ST05裡面看到的這個Recs是指滿足OPEN CURSOR 指定條件的記錄的個數,並不是最後返回給ABAP層的記錄的個數。
而在我的測試系統裡,表COMM_PRODUCT總共就包含1447條記錄。
然後我再生成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的原創技術文章,請關注公眾號"汪子熙"或者掃描下面二維碼:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2151853/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用事務碼 SAT 比較 SELECT SQL 語句和 OPEN / FETCH CURSOR 分塊讀取的效能差異SQL
- 使用 ABAP Open SQL 的 Select AS 別名,提高程式碼可讀性SQL
- ABAP的OPEN SQL和Hybris Commerce的Flexible Search簡介SQLFlex
- ABAP 740新的OPEN SQL增強特性SQL
- 在 ABAP 層執行 Open SQL 的幕後操作 - 武俠版SQL
- 一個小技巧,讓您的ABAP OPEN SQL具有自描述效果SQL
- [20200417]跟蹤特定sql語句以及v$open_cursor檢視.txtSQL
- [20200423]防水牆與v$open_cursor.txt
- 【CURSOR】How to Monitor and tune Open and Cached Cursors (Doc ID 1430255.1)
- [20200422]跟蹤特定sql語句以及v$open_cursor檢視(補充).txtSQL
- [20200417]跟蹤特定sql語句以及v$open_cursor檢視2.txtSQL
- [20201207]12c v$open_cursor檢視.txt
- [20200424]跟蹤特定sql語句以及v$open_cursor檢視(再補充).txtSQL
- ABAP SICF服務和Java Servlet的比較JavaServlet
- SAP ABAP ADBC和Java JDBC的使用比較JavaJDBC
- Java的位元組碼和ABAP load的比較Java
- 使用 OPEN CURSOR 和 FETCH NEXT CURSOR 對 SAP 資料庫表進行分塊讀寫試讀版資料庫
- open和close函式函式
- 比較Windows和Linux SQL容器WindowsLinuxSQL
- XMLHttpRequest open()XMLHTTP
- 開源系統監控工具Nagios、Zabbix和Open-Falcon的功能特性彙總及優缺點比較iOS
- [20200212]使用DBMS_SHARED_POOL.MARKHOT與檢視v$open_cursor.txt
- SQL、NoSQL和NewSQL的優缺點比較SQL
- MySQL:Table_open_cache_hits/Table_open_cache_misses/Table_open_cache_overflowsMySql
- 【Open-Falcon】Linux下安裝Open-FalconLinux
- JOI Open 2018
- JOI Open 2016
- BSUIR Open FinalsUI
- DUMP-CX_SY_OPEN_SQL_DB-DBSQL_DUPLICATE_KEY_ERRORSQLError
- OPUS裡的Silk和原始Silk簡單比較
- EBS:OM Sales Order銷售訂單【Open Interface、Open API】API
- DB2 和SQL Server自增列比較DB2SQLServer
- openGauss lo_open
- [JOI Open 2024] 中暑
- open Euler安全加固
- Oracle:open_cursorsOracle
- 關於 SAP ABAP SYSTEM_SHM_OPEN_CHANGE_LOCK 執行時錯誤的問題
- 深度對比Apache CarbonData、Hudi和Open Delta三大開源資料湖方案Apache