使用 OPEN CURSOR 和 FETCH NEXT CURSOR 对 SAP 数据库表进行分块读写试读版

简介: 使用 OPEN CURSOR 和 FETCH NEXT CURSOR 对 SAP 数据库表进行分块读写试读版

开发任务


开发一个 ABAP 函数:

  • 输入参数为 iv_count, 指定该 ABAP 函数的调用者,期望函数返回的记录个数。
  • 输出参数为 et_data, 这是一张内表,包含了满足指定条件的来自数据库表 A 里的记录数。et_data 的记录数,小于等于 iv_count.


指定条件意思是,对于每条从数据库表 A 取回来的记录数,调用另一个 ABAP 函数 C,进行权限检查,如果当前用户没有足够的权限查看这条记录,就忽略这条记录,继续处理下一条。如果有权限查看,就把这条记录添加到输出参数 et_data 里。


当 et_data 的行数等于 iv_count 或者数据库表里的全部数据都被循环处理后,结束循环。


ABAP Function Module C 的逻辑比较复杂,没办法在数据库层面进行权限检查,所以只好把数据从数据库表取出来之后,在 ABAP 层进行检查。


第一版实现:将数据库表的全部内容,读取到 ABAP 应用层进行处理


向我咨询的朋友第一版的 ABAP 代码实现流程如下:

23649898499b78042681155753f0710d.png

按照这个实现思路,写出来的 ABAP 函数完整源代码如下:

FUNCTION zselect_filter.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     REFERENCE(IV_COUNT) TYPE  INT4 DEFAULT 100
*"  EXPORTING
*"     REFERENCE(ET_DATA) TYPE  STRING_TABLE
*"----------------------------------------------------------------------
  DATA: lt_data       TYPE TABLE OF tadir,
        ls_data       TYPE tadir,
        lv_can_access TYPE abap_bool.
  SELECT * INTO TABLE lt_data FROM tadir.
  LOOP AT lt_data INTO ls_data.
    PERFORM authorization_check USING ls_data CHANGING lv_can_access.
    IF lv_can_access = abap_true.
      APPEND |{ ls_data-object }-{ ls_data-obj_name }| TO et_data.
    ENDIF.
    IF lines( et_data ) = iv_count.
      EXIT.
    ENDIF.
  ENDLOOP.
ENDFUNCTION.
FORM authorization_check USING is_data TYPE tadir CHANGING cv_result TYPE abap_bool.
  cv_result = abap_true.
ENDFORM.

输入参数:

be0bd0de17e9af995919d67cdb38a5a8.png

输出参数:

d47423feb06c0642c79bfb9b263f1079.png

关于 ABAP 字符串模板的更多使用方法,参考本教程这篇文章:

  • 28. SAP ABAP 字符串变量容易疏忽和混淆的一些知识点

5c9fa011f024c6acff9a5629a0d92f26.png

直接 F8 执行函数,默认的输入参数值为 100:


6147682aa35a6544d2159950347102c0.png


执行之后,看到 et_data 输出参数包含了 100 条列表:

bd1f33f3e40514eeb83554b63c274ae2.png

单击上图的 100 Entries,可以看到全部 100 条记录。

d13606aff1b503e95c33aa599eed2d68.png

本教程上一篇文章,详细分析了这种解法可能会造成运行当前 ABAP 程序出现内存耗尽的问题发生:


78. 浅谈 ABAP 程序运行时出现『内存耗尽』错误的问题

如下图所示:将 TADIR 数据库表的 200 万条数据,全部从数据库层读取到应用层,再在 ABAP 端逐一遍历。这种实现方式虽然从写代码层面来说思路比较简单,但是却造成了巨大的内存存储空间的浪费——举个极端的情况,函数调用者如果将 IV_COUNT 指定为 1,即只希望返回一条 符合权限控制的记录,那我们将 200 万条数据全部读取出来,岂不是大材小用吗?

66a3e4ac4fdb6f20c21f8df8b3b027fc.png

下面我们采取分块读取数据库表的方式,重新实现这个 ABAP 函数。

分块读取数据库表需要使用 OPEN CURSORFETCH NEXT CURSOR 这组关键字,具体使用步骤在我这篇教程里有详细介绍。

相关文章
|
25天前
|
SQL 数据库 索引
关于 SAP ABAP REPOSRC 数据库表在 HANA 中的 DDL Definition
关于 SAP ABAP REPOSRC 数据库表在 HANA 中的 DDL Definition
19 1
关于 SAP ABAP REPOSRC 数据库表在 HANA 中的 DDL Definition
|
1月前
|
Web App开发 数据采集 前端开发
纯技术讨论:如何让 SAP UI5 应用无法被别人在浏览器里调试 - 这种做法不推荐试读版
纯技术讨论:如何让 SAP UI5 应用无法被别人在浏览器里调试 - 这种做法不推荐试读版
15 0
|
1月前
|
搜索推荐
如何让 SAP UI5 Smart Table 支持多项选择(Multiple-Selection)试读版
如何让 SAP UI5 Smart Table 支持多项选择(Multiple-Selection)试读版
18 0
|
1月前
使用 SAP UI5 Event Bus 机制,修复 SAP UI5 分页显示数据的一个 bug 试读版
使用 SAP UI5 Event Bus 机制,修复 SAP UI5 分页显示数据的一个 bug 试读版
20 0
|
2月前
SAP UI5 应用如何实现类似百度首页一样的访问方式试读版
SAP UI5 应用如何实现类似百度首页一样的访问方式试读版
35 0
|
2月前
|
存储 SQL 数据库
关于 SAP ABAP 数据库表 GTADIR
关于 SAP ABAP 数据库表 GTADIR
27 0
|
2月前
让 SAP UI5 应用的日志打印变得五彩缤纷试读版
让 SAP UI5 应用的日志打印变得五彩缤纷试读版
97 2
|
25天前
|
数据库 存储 BI
SAP ABAP CDS View 源代码存储的数据库表揭秘和其他相关数据库表介绍试读版
SAP ABAP CDS View 源代码存储的数据库表揭秘和其他相关数据库表介绍试读版
12 0
SAP ABAP CDS View 源代码存储的数据库表揭秘和其他相关数据库表介绍试读版
|
25天前
|
数据库
迈入 SAP CDS View 世界的前置知识 - SAP ABAP 数据库视图介绍试读版
迈入 SAP CDS View 世界的前置知识 - SAP ABAP 数据库视图介绍试读版
10 0
迈入 SAP CDS View 世界的前置知识 - SAP ABAP 数据库视图介绍试读版
|
1月前
SAP ABAP ALV 的分组显示和 Subtotal 显示实现的技术步骤试读版
SAP ABAP ALV 的分组显示和 Subtotal 显示实现的技术步骤试读版
33 0