共计 1570 个字符,预计需要花费 4 分钟才能阅读完成。
行业资讯
数据库
如何进行 ABAP OPEN SQL 中 OPEN CURSOR 和 SELECT 的比较
本篇文章为大家展示了如何进行 ABAP OPEN SQL 中 OPEN CURSOR 和 SELECT 的比较,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
我写了一个很简单的 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 那样的机制,使得其能够记住当前正在操作的记录在结果集里的位置。
上述内容就是如何进行 ABAP OPEN SQL 中 OPEN CURSOR 和 SELECT 的比较,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注丸趣 TV 行业资讯频道。