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的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:


ABAP OPEN SQL里OPEN CURSOR和SELECT的比较的更多相关文章
- SQL Server游标 C# DataTable.Select() 筛选数据 什么是SQL游标? SQL Server数据类型转换方法 LinQ是什么? SQL Server 分页方法汇总
SQL Server游标 转载自:http://www.cnblogs.com/knowledgesea/p/3699851.html. 什么是游标 结果集,结果集就是select查询之后返回的所 ...
- SQL 里解析 XML 格式 字段 信息
DECLARE @ItemMessage XML ),zje ),yfje ),bcje ),URL ),Remark )) SET @ItemMessage=N'<List> <i ...
- sql 里 text类型的操作(转载)
SQL Server中TEXT类型字段值在数据库中追加字符串方法 对text类型字段值进行追加更新的操作,一开始用了简单的update语句试了试,有错误,原来text.ntext类型的字段不能和 va ...
- sql里的in对应linq的写法 及 IQueryable转化为Dictionary
string[] arID = { "0001", "0002" }; var dict = this.service.GetMyList(m => ar ...
- 你确定 SQL 查询都是以 SELECT 开始的?
很多 SQL 查询都是以 SELECT 开始的. 不过,最近我跟别人解释什么是窗口函数,我在网上搜索"是否可以对窗口函数返回的结果进行过滤"这个问题,得出的结论是"窗口函 ...
- 图解 SQL 里的各种 JOIN
约定 下文将使用两个数据库表 Table_A 和 Table_B 来进行示例讲解,其结构与数据分别如下: mysql> SELECT * FROM Table_A ORDER BY PK ASC ...
- 【ABAP系列】SAP ABAP基础-SQL的嵌套使用
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP基础-SQL的嵌 ...
- 在SQL里如何写条件逻辑?
主要涉及CASE,WHEN之类.. 不同的服务器上实现if...else...是不一样的. 建议用CASE ,WHEN,因为它们是SQL国标呢. mysql> SELECT -> SUM( ...
- 将数组里的元素拼接成sql里的in条件
/** * 将数组里的元素拼接成sql里的in条件,如'a1','a2','a3' * @param array * @returns */function makeSqlInStr(array){ ...
随机推荐
- switch case 注意事项
switch case常见的注意事项: 1.case后面常量值的顺序可以任意,一般按顺序编写 2.default顺序也可以编写在switch中的任意位置 当所有case都不满足时则执行default ...
- HDFS基本shell操作
在客户端输入Hadoop fs,可以查看所有的,hadoop shell # -help [cmd] //显示命令的帮助信息,如: hadoop fs -help ls # -ls(r) <pa ...
- java并发编程 - Exexctor简介
Exexctor 常用类关系图 Executor 接口 Excutor 接口定义如下 ExecutorService ExecutorService 是一个比 Executor 使用更广泛的子类接口, ...
- nyoj 1023——还是回文——————【区间dp】
还是回文 时间限制:2000 ms | 内存限制:65535 KB 难度:3 描述 判断回文串很简单,把字符串变成回文串也不难.现在我们增加点难度,给出一串字符(全部是小写字母),添加或删除一 ...
- [转]微信小程序开发系列(一)小程序开发初体验
本文转自:http://www.cnblogs.com/rennix/p/6287432.html 开发小程序所需的基本技能 关于小程序的介绍和使用场景这里不作介绍,这个系列的文章会一步一步地带领 ...
- Cookie的应用实例
ASP.NET设置元素CSS属性 1.添加一条CSS规则: control.style.add("CSS名称",“CSS值”); 2.添加Class规则 Control.CSSCl ...
- MyEclipse 中tomcat 调试时进入未打断点的代码
在preferences里面取消挂起未捕获异常
- DOM的概念和简单应用:使用DOM解析XML数据
概念:DOM是Document Object Model的简称,即文档数据模型. Oracle公司提供了JAXP(Java API for XML Processing)来解析XML.JAXP会把XM ...
- Android-自定义View实现ImageView播放gif
http://blog.csdn.net/guolin_blog/article/details/11100315 总体思路是这样的 PowerImageView类继承ImageView类 给Powe ...
- C#简单实现读取txt文本文件并分页存储到数组
最近做一个VR项目,需要把某个中草药的介绍信息分页显示到unity场景里然后用VR手柄切换信息. unity的脚本是c#,就先在本地写了个代码测试了一下,利用控制台测试输出,到时候拷贝函数过去再结合交 ...