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数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

C#实现SHP文件读取与地图显示的完整教程

《C#实现SHP文件读取与地图显示的完整教程》在地理信息系统(GIS)开发中,SHP文件是一种常见的矢量数据格式,本文将详细介绍如何使用C#读取SHP文件并实现地图显示功能,包括坐标转换、图形渲染、平... 目录概述功能特点核心代码解析1. 文件读取与初始化2. 坐标转换3. 图形绘制4. 地图交互功能缩放

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

java读取excel文件为base64实现方式

《java读取excel文件为base64实现方式》文章介绍使用ApachePOI和EasyExcel处理Excel文件并转换为Base64的方法,强调EasyExcel适合大文件且内存占用低,需注意... 目录使用 Apache POI 读取 Excel 并转换为 Base64使用 EasyExcel 处

Oracle数据库在windows系统上重启步骤

《Oracle数据库在windows系统上重启步骤》有时候在服务中重启了oracle之后,数据库并不能正常访问,下面:本文主要介绍Oracle数据库在windows系统上重启的相关资料,文中通过代... oracle数据库在Windows上重启的方法我这里是使用oracle自带的sqlplus工具实现的方