乐趣区

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

@TOC

在本教程前一步骤,咱们介绍了须要对 ABAP 数据库表进行分块读写的场合,这是来自一个敌人向我征询的理论问题。

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

开发工作

开发一个 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 代码实现流程如下:

依照这个实现思路,写进去的 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.

输出参数:

输入参数:

对于 ABAP 字符串模板的更多应用办法,参考本教程这篇文章:

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

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

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

单击上图的 100 Entries,能够看到全副 100 条记录。

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

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

如下图所示:将 TADIR 数据库表的 200 万条数据,全副从数据库层读取到应用层,再在 ABAP 端逐个遍历。这种实现形式尽管从写代码层面来说思路比较简单,然而却造成了微小的内存存储空间的节约——举个极其的状况,函数调用者如果将 IV_COUNT 指定为 1,即只心愿返回 一条 合乎权限管制的记录,那咱们将 200 万条数据全副读取进去,岂不是大材小用吗?

上面咱们采取分块读取数据库表的形式,从新实现这个 ABAP 函数。

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

退出移动版