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的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:
相关推荐
这个是国外人使用ABAP写的一个类似一SQL Server的查询分析器,它能够直接运行ABAP的OPEN SQL,由于SE11或者是SE16都只能对一表进行查询,但很多的时候我们需要对多个表进行联合查询,这时就可以发挥很大作用了,希望...
讲解了ABAP SQL Functions for Strings的使用
ABAP中SQL语法详细介绍,包括基础语法和各种聚合函数,如MAX,MIN,AVG,COUNT,SUM,DIV,MOD,CEIL,FLOOR,DIVSION,ROUND,FOR ALL ENTRIES IN.除了各种聚合函数还有字段拆分,连接,子语句查询,字段类型转换,分情况赋值...
本程序自主开发,包括SELECT,UPDATE,DELETE,INSERT操作,SELECT 语句可以根据自定义的内表动态的输出ALV 列表,UPDATE DELETE INSERT 语句可以对数据库表进行操作. 切忌谨慎应用此程序对数据库的操作,以免造成数据...
ZQUERY - Open SQL Editor 是一个项目,允许您执行和构建 SAP ABAP Open SQL 查询,而无需创建测试程序。 您可以创建查询并生成自己的类型。 生成您的 Where 子句,甚至是您的 Select 子句。 要安装 ZQUERY 程序,...
sap ABAP 配置外界数据库SQL server驱动,官方步骤。
APAP程序 用于open sql 直接查询 database
关于SQL语句的性能
基于SAPR/3系统的ABAP语言OpenSQL应用.pdf
abap SQL优化 abap编程的SQL的性能优化,在编程时注意的地方,可以是程序性能更好!
ABAP SQL使用技巧,可以提高程序的运行速度,降低数据交换的时间。
11. ABAP Open SQL Extensions 12. Authorizations, Passing Between Programs, Catching Runtime Errors 13. Events 14. Selectin Screens and User Messages 15. Using the SQL Trace Tool
Update和Select结合使用,批量做更新。
ABAP SELECT-SCREEN 的几个用法.doc
SAP ABAP开发学习——第14课:动态SQL(视频教程) 1.SAP ABAP开发入门学习 2.含视频教程学习、PPT、作业 3.视频非常清晰
SAP IDES ECC6.0 SR2 ABAP For SQL2005安裝手冊
SAP查询分析器 ABAP源码,安装方法,可以类似查询分析器的形式执行ABAP OPEN SQL SAP查询分析器 ABAP源码,安装方法,可以类似查询分析器的形式执行ABAP OPEN SQL
ABAP程序的数据查询语句SELECT.doc
很实用的ABAP select 语句示例,具有参考价值。
DBCO通过ABAP程序连接外部数据库