SAP 通过游标来分批从数据库表读取2G数据

2023-11-20 19:36

本文主要是介绍SAP 通过游标来分批从数据库表读取2G数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文链接:https://blog.csdn.net/Buffalo_soldier/article/details/109772612
我们在写程序的时候可能会遇到用内表处理超大量数据的情况,比如取MSEG、BSEG表,内表里的数据如果超过2G就会报程序dump了,所以关键是要控制内表的数据量。

以下载一个系统表的数据为例,选择界面输入系统表名,用户点执行则将系统表数据下载到本地或进行其他处理。

第一步,计算系统表一条数据占用的内存;

第二步,计算内表最多可以存多少条数据;

第三步,每次处理最大条目数的数据。
示例代码:

*&---------------------------------------------------------------------*
*& Report ZCYCLE062
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zcycle062.PARAMETERS : p_table TYPE ddobjname. "数据库表名DATA : db_cursor TYPE cursor.  "定义游标
DATA : lt_dfies       TYPE TABLE OF dfies,ls_dfies       TYPE dfies,struc_size     TYPE i VALUE 0,g_package_size TYPE i.
FIELD-SYMBOLS : <xtab> TYPE ANY TABLE. "取出的表数据
DATA : l_refitab TYPE REF TO data.
CREATE DATA l_refitab TYPE TABLE OF (p_table).
ASSIGN l_refitab->* TO <xtab>.
FIELD-SYMBOLS <otab> TYPE ANY . "读取表数据的表空间* 取系统表结构
CALL FUNCTION 'DDIF_NAMETAB_GET'EXPORTINGtabname   = p_tableTABLESdfies_tab = lt_dfiesEXCEPTIONSnot_found = 1OTHERS    = 2.
IF sy-subrc <> 0.EXIT.
ENDIF.** 每个数据包的逻辑
* 计算一条数据占用的内存
LOOP AT lt_dfies INTO ls_dfies.struc_size = struc_size + ls_dfies-leng.
ENDLOOP.***** 计算2G内存可以存储多少条数据 2G = 2147483648字节
g_package_size = 2147483648 / struc_size."打开游标
OPEN CURSOR WITH HOLD db_cursor FOR
SELECT * FROM (p_table)
BYPASSING BUFFER.
DO.
*** 每次取2g的数据包"通过游标读取数据FETCH NEXT CURSOR db_cursorINTO CORRESPONDING FIELDS OF TABLE <xtab> "<xtab>就是从表里取出来的2g数据PACKAGE SIZE g_package_size. "每次读取2G的数据IF sy-subrc NE 0.CLOSE CURSOR db_cursor.EXIT. "没取到数据则跳出循环ENDIF.*** 对数据包的进一步操作"读取内表信息LOOP AT <xtab> ASSIGNING <otab>.cl_demo_output=>write( <otab> ). "一行行写数据准备输出ENDLOOP.
ENDDO.cl_demo_output=>display( ). "一次性输出

输入
在这里插入图片描述
输出
在这里插入图片描述
同理,程序逻辑中遇到内表超内存dump也可以分批次处理,比如销售订单的全流程跟踪中,从VBAK中取出50万条销售订单数据,然后根据这些销售订单作为索引去取数据流中交货单、发票等等信息,一次性处理这50万条数据可能就会程序dump,可以定义一个索引内表,10万或者5万一次来执行后面的逻辑,从而避免程序dump。

这篇关于SAP 通过游标来分批从数据库表读取2G数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/396940

相关文章

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

SpringBatch数据写入实现

《SpringBatch数据写入实现》SpringBatch通过ItemWriter接口及其丰富的实现,提供了强大的数据写入能力,本文主要介绍了SpringBatch数据写入实现,具有一定的参考价值,... 目录python引言一、ItemWriter核心概念二、数据库写入实现三、文件写入实现四、多目标写入

使用Python将JSON,XML和YAML数据写入Excel文件

《使用Python将JSON,XML和YAML数据写入Excel文件》JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体,本文将介绍如何... 目录如何使用python写入数据到Excel工作表用Python导入jsON数据到Excel工作表用

Mysql如何将数据按照年月分组的统计

《Mysql如何将数据按照年月分组的统计》:本文主要介绍Mysql如何将数据按照年月分组的统计方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql将数据按照年月分组的统计要的效果方案总结Mysql将数据按照年月分组的统计要的效果方案① 使用 DA

鸿蒙中Axios数据请求的封装和配置方法

《鸿蒙中Axios数据请求的封装和配置方法》:本文主要介绍鸿蒙中Axios数据请求的封装和配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.配置权限 应用级权限和系统级权限2.配置网络请求的代码3.下载在Entry中 下载AxIOS4.封装Htt

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,