美文网首页
使用 OPEN CURSOR 和 FETCH NEXT CURS

使用 OPEN CURSOR 和 FETCH NEXT CURS

作者: 华山令狐冲 | 来源:发表于2023-01-09 16:21 被阅读0次

@TOC

在本教程前一步骤,我们介绍了需要对 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 字符串模板的更多使用方法,参考本教程这篇文章:

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

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

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

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

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

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

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

相关文章

  • 使用 OPEN CURSOR 和 FETCH NEXT CURS

    @TOC[%E6%96%87%E7%AB%A0%E7%9B%AE%E5%BD%95] 在本教程前一步骤,我们介绍了...

  • 第一个

    解释一下cursor:cursor叫做游标对象,相当于行驶在连接python与mysql高速上的列车。通过curs...

  • 游标

    游标-处理多行数据类型 --方法一 declare --定义游标 cursor user_sum_curs...

  • SQL分页的几种方法

    方法一 使用offset fetch next(2012版本及以上版本才可以使用) 方法二 使用row_numbe...

  • next使用浏览器fetch

    官网推荐的是 isomorphic-unfetch,但是这是node端的fetch,有些功能是不具备的,例如 cr...

  • chapter12_数据库编程_2_游标

    处理多行数据的操作要使用游标cursor 游标有四个基本操作:(1) 声明 DECLARE(2) 打开 OPEN(...

  • Android笔记——关于Cursor类的介绍

    使用过 SQLite数据库的童鞋对 Cursor 应该不陌生,加深自己和大家对Android 中使用 Cursor...

  • pymysql

    安装 基本使用 如果需要返回字典格式可以设置cursor = conn.cursor(cursor=pymysql...

  • Fetch

    Fetch API使用 Fetch

  • sql 语句之offset 和fetch next

    offset 偏移量,跳过1行 ,再 fetch next 显示之后的1行

网友评论

      本文标题:使用 OPEN CURSOR 和 FETCH NEXT CURS

      本文链接:https://www.haomeiwen.com/subject/crzpcdtx.html