博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ABAP OPEN SQL里OPEN CURSOR和SELECT的比较
阅读量:2438 次
发布时间:2019-05-10

本文共 2249 字,大约阅读时间需要 7 分钟。

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.

575

第二次以size = 100执行,PREPARE和OPEN直接变成REOPEN,但是recs仍然是1447.

568

对ST05里的字段Recs按F1,查看说明:

235

这个1447是怎么来的呢?因为我OPEN CURSOR时候没有指定任何条件,所以在OPEN CURSOR时,DB把整个product表的所有记录视为一个结果集,然后只返回指定package size的条数。

所以ST05里面看到的这个Recs是指满足OPEN CURSOR 指定条件的记录的个数,并不是最后返回给ABAP层的记录的个数。

而在我的测试系统里,表COMM_PRODUCT总共就包含1447条记录。

404

然后我再生成3个新的product,COMM_PRODUCT里面就有1450条entry。

重复执行测试report。ST05发现被扫描的记录数变成了1450,证明我们的结论是正确的。

577

再做一个验证:表COMM_PRODUCT里面有prefix为JERRY06152012开头的3条记录:

329

修改上述的测试report,添加一个WHERE查询条件:

OPEN CURSOR lv_cursor FOR SELECT product_guid FROM comm_productWHERE product_id LIKE 'JERRY06152012%'.

第一次执行size = 1

Recs变成3了,因为匹配OPEN CURSOR条件的确实只有3条记录

700

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。

631

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

700

Num = 143

690

说明SELECT UP TO XX ROWS是可以控制数据库表里到底有多少条记录被处理的。

但SELECT UP TO XX ROWS不能像OPEN CURSOR那样能够在WHILE循环里面反复执行,它不具备像OPEN CURSOR那样的机制,使得其能够记住当前正在操作的记录在结果集里的位置。

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

283
531

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24475491/viewspace-2151853/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/24475491/viewspace-2151853/

你可能感兴趣的文章
Windows使用Apche并查看MySQL数据库(转)
查看>>
Shell 符号(转)
查看>>
Fedora Core 6 Pre release images available(转)
查看>>
linux下配置APACHE2.0.50+PHP5.0.3+MYSQL4.0.20+GD库(转)
查看>>
JAVA基础:我个人的面向对象的程序观(转)
查看>>
Linux操作系统内存管理的源码实现(转)
查看>>
RedHat 9上用iptables做NAT网关+远程使用kiwisyslog记录日志(转)
查看>>
root文件系统的一点经验(转)
查看>>
双系统 linux and winodws ,在windows重装以后(转)
查看>>
[Linux]用户及密码相关命令(转)
查看>>
FreeBSD中文化全攻略(转)
查看>>
在Linux上不带硬件安装Asterisk(转)
查看>>
UNIX(IBM AIX)系统基础知识(转)
查看>>
FC5下JRE的安装配置(转)
查看>>
从硬盘安装debian详细过程(通过chroot完成)(转)
查看>>
.bash_profile和.bashrc的什么区别(转)
查看>>
严防死守把蠕虫病毒拒绝在系统之外(转)
查看>>
深入分析Linux系统深度安全加固(转)
查看>>
Linux 脚本编写基础(转)
查看>>
JAVA基础:利用Java实现zip压缩解压缩(转)
查看>>