HANA:传参,游标(Cursor)应用,FOR循环,解决存储表内存溢出的问题

作者 idan lian  如需转载备注出处

1.应用场景

最近项目上用HANA开发的比较多,之前我是bw用的比较多,就不会有这种问题。我们这个项目很多都是开发的计算视图,但最近做acdoca的逻辑时,计算视图在生产环境执行的时候报错,报的内存溢出,acdoca上亿的数据,直接用计算视图确实跑不出来,跑出来也要跑很久,内存溢出的报错如下这种。

想解决内存溢出和查询慢的这个问题,只有把中间过程落地存储成数据库表了,有点类似BW ADSO的分层,但是HANA分层直接插入数据库表的时候,插入数据的时候也是直接去处理acdoca全部的数据,依然报错,内存溢出。

BW ADSO建模为什么不报错呢。因为adso存储的时候执行DTP。是分包跑的,就是acdoca几亿的 数据量,我也是根据包大小去分开上千个包执行落地的,这次的解决方案就是模仿这种逻辑

2.实现步骤

定义参数:对HANA最底层视图定义参数,在HANA中间层视图也创建一个相同的参数

参数传递:

在中间层把中间层的视图传递给最底层,

创建存储过程时根据定义的游标,按字段的不通去for循环分开循环执行,字段的值会传递到中间层参数,从而传递到最底层视图的参数,限制最底层数据,实现类似的分包处理。

3.传参,HANA游标,及FOR循环

上面想到了解决办法,怎么实现呢,大体的思路就是分公司或者分期间,去循环执行存储过程,这样可以有效减少最底层处理的数据量,解决内存溢出的问题,执行这个的时候一定要注意,你的计算视图逻辑里,有没有跨公司的逻辑,或者跨年的逻辑,如果有,就不能这样分开去处理,我这里用我项目上的为例,是分开按年份执行的,这样可以在内存允许的范围内减少循环次数。

传参:涉及到减少acdoca最底层的计算数据量,那么我中间层按年份执行的变量参数怎么传给最底层呢,这里涉及到定义HANA参数,以及HANA参数的传递,这是我本次需求的最底层视图和中间层定义的参数和参数限制,最底层为图形化视图,主要是acdoca的明细数据,中间层为计算视图,是通用逻辑处理。

3.1传参

首先看参数的创建和传递

基础数据层视图

最底层为ACDOCA模型,如图创建参数

参数限制写在过滤中

中间层视图

中间层为脚本视图,定义参数及参数传递如下

这里参数传递的语法如下:

PLACEHOLDER."$$参数"=>:需要传递的参数

存储过程中的传参

后面会把存储过程的代码贴出来,可以参考

3.2.HANA游标,及FOR循环

游标有些没接触过的比较陌生,先说下根据我百度到的和个人理解的概念

什么是数据库游标?
可以将数据库游标视为指向查询结果中特定行的指针。指针可以从一行移动到下一行。根据游标的类型,您甚至可以将其移动到上一行。
可以这样想:SQL结果就像一个袋子,你可以一次保存一大堆行,但不能单独保存任何一行;而游标就像一把镊子。有了它,你可以把手伸进包里抓一排,然后移到下一个。

这样理解游标是不是很像abap定义内表,定义工作区,for循环就是去循环抓取数据。

特殊说明一下游标的语法

--定义游标表及赋值,游标表的数据为select的字段及数据(类似abap定义内表,内表赋值),

DECLARE CURSOR  游标表 FOR

SELECT DISTINCT 表字段 FROM 查询表";

循环读取数据到R工作区)

FOR 工作区 AS 游标表DO

****数据处理****

FROM 表名(PLACEHOLDER."$$变量$$" =>: 工作区.字段 )--R工作区字段循环传参赋值

END FOR;--结束循环

4.存储代码示例

实现存储过程的代码如下,定义游标关键步骤的注释我都写的很详细,不特殊解释了

create procedure "SAPHANADB".ZPR_insert_ZBWT_DT_BPC as/********* Begin Procedure Script ************/ 
BEGIN 
--定义游标表ZGJAHR,游标表的数据为select的字段及数据(类似abap定义内表,内表赋值)
DECLARE CURSOR  ZGJAHR FOR 
SELECT DISTINCT GJAHR FROM "SAPHANADB"."/BIC/AZEFI00012";  truncate table "SAPHANADB"."ZBWT_DT_BPC";
--执行FOR循环,根据游标数据循环读取到R中,(定义的R我理解有点类似定义abap的工作区,循环读取数据到R工作区)
FOR R AS ZGJAHR DO
insert into "SAPHANADB"."ZBWT_DT_BPC"
SELECT"TIME" || ROW_NUMBER()OVER(ORDER BY "TIME","ENTITY")  AS "ID","TIME",CASE WHEN "ACCOUNT" IS NULL THEN '' ELSE "ACCOUNT" END AS "ACCOUNT","ENTITY","ENTITY_TEXT","INTERCO","INTERCO_TEXT","AUDITTRAIL","CATEGORY","SCOPE","RHCUR","RWCUR","TYPE","MISC","KUNNR","KIDNO","ZZYLIU6","ZZYLIU11","VTWEG",CASE WHEN "FLOW" IS NULL THEN '' ELSE "FLOW" END AS "FLOW",CASE WHEN  "ZHBHB" IS NULL THEN '' ELSE  "ZHBHB" END AS  "ZHBHB", 	CASE WHEN  "ZLOGIC_CODE" IS NULL THEN '' ELSE  "ZLOGIC_CODE" END AS  "ZLOGIC_CODE", CASE WHEN  "ZLOGIC_VALUE" IS NULL THEN '' ELSE  "ZLOGIC_VALUE" END AS  "ZLOGIC_VALUE", "RSTGR","RFAREA","DRCRK","RASSC","MATKL",CASE WHEN "MATKL_HB" IS NULL THEN '' ELSE "MATKL_HB" END AS "MATKL_HB",CASE WHEN "CODE_QD_D" IS NULL THEN '' ELSE "CODE_QD_D" END AS "CODE_QD_D",CASE WHEN "CODE_QD_E" IS NULL THEN '' ELSE "CODE_QD_E" END AS "CODE_QD_E","RACCT","RMVCT",CASE WHEN "LAND1" IS NULL THEN '' ELSE "LAND1" END AS "LAND1",CASE WHEN "REGION" IS NULL THEN '' ELSE "REGION" END AS "REGION","ZZYLIU10","MATNR",CASE WHEN "MATNR_TEXT" IS NULL THEN '' ELSE "MATNR_TEXT" END AS "MATNR_TEXT","BTTYPE","ZDATE",CASE WHEN "PSPID" IS NULL THEN '' ELSE "PSPID" END AS "PSPID",CASE WHEN "AUFNR" IS NULL THEN '' ELSE "AUFNR" END AS "AUFNR",CASE WHEN "ZZYLIU9" IS NULL THEN '' ELSE "ZZYLIU9" END AS "ZZYLIU9",CASE WHEN "ATTRIBUTE1" IS NULL THEN '' ELSE "ATTRIBUTE1" END AS "ATTRIBUTE1",CASE WHEN "ATTRIBUTE2" IS NULL THEN '' ELSE "ATTRIBUTE2" END AS "ATTRIBUTE2",CASE WHEN "ATTRIBUTE3" IS NULL THEN '' ELSE "ATTRIBUTE3" END AS "ATTRIBUTE3",CASE WHEN "HKONT_SR" IS NULL THEN '' ELSE "HKONT_SR" END AS "HKONT_SR",CASE WHEN "HKONT_CB" IS NULL THEN '' ELSE "HKONT_CB" END AS "HKONT_CB","PS_POSID","ZSJLY","ZSFJS","ZCHBJ","WERKS","NPLNR","ZDXJT",sum("HSL") AS "HSL",sum("WSL") AS "WSL",sum("MSL") AS "MSL" 
FROM "_SYS_BIC"."ZP_DFYH_BW.ZP_LL/ZCV_DT_BPC"(PLACEHOLDER."$$IP_GJAHR$$" =>:R.GJAHR)--R工作区字段循环传参赋值
GROUP BY "TIME",CASE WHEN "ACCOUNT" IS NULL THEN '' ELSE "ACCOUNT" END,"ENTITY","ENTITY_TEXT","INTERCO","INTERCO_TEXT","AUDITTRAIL","CATEGORY","SCOPE","RHCUR","RWCUR","TYPE","MISC","KUNNR","KIDNO","ZZYLIU6","ZZYLIU11","VTWEG",CASE WHEN "FLOW" IS NULL THEN '' ELSE "FLOW" END,CASE WHEN  "ZHBHB" IS NULL THEN '' ELSE  "ZHBHB" END, 	CASE WHEN  "ZLOGIC_CODE" IS NULL THEN '' ELSE  "ZLOGIC_CODE" END, CASE WHEN  "ZLOGIC_VALUE" IS NULL THEN '' ELSE  "ZLOGIC_VALUE" END, "RSTGR","RFAREA","DRCRK","RASSC","MATKL",CASE WHEN "MATKL_HB" IS NULL THEN '' ELSE "MATKL_HB" END,CASE WHEN "CODE_QD_D" IS NULL THEN '' ELSE "CODE_QD_D" END,CASE WHEN "CODE_QD_E" IS NULL THEN '' ELSE "CODE_QD_E" END,"RACCT","RMVCT",CASE WHEN "LAND1" IS NULL THEN '' ELSE "LAND1" END,CASE WHEN "REGION" IS NULL THEN '' ELSE "REGION" END,"ZZYLIU10","MATNR",CASE WHEN "MATNR_TEXT" IS NULL THEN '' ELSE "MATNR_TEXT" END,"BTTYPE","ZDATE",CASE WHEN "PSPID" IS NULL THEN '' ELSE "PSPID" END,CASE WHEN "AUFNR" IS NULL THEN '' ELSE "AUFNR" END,CASE WHEN "ZZYLIU9" IS NULL THEN '' ELSE "ZZYLIU9" END,CASE WHEN "ATTRIBUTE1" IS NULL THEN '' ELSE "ATTRIBUTE1" END,CASE WHEN "ATTRIBUTE2" IS NULL THEN '' ELSE "ATTRIBUTE2" END,CASE WHEN "ATTRIBUTE3" IS NULL THEN '' ELSE "ATTRIBUTE3" END,CASE WHEN "HKONT_SR" IS NULL THEN '' ELSE "HKONT_SR" END,CASE WHEN "HKONT_CB" IS NULL THEN '' ELSE "HKONT_CB" END,"PS_POSID","ZSJLY","ZSFJS","ZCHBJ","WERKS","NPLNR","ZDXJT";END FOR;--结束循环
END

以上方式处理后,再执行存储过程,就会分包处理,不会报错了,如果对大家有帮助希望点赞一下,谢谢,也欢迎评论交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/626517.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flink 1.18 sql gateway /sql gateway jdbc

一 sql gateway 注意 之所以直接启动gateway 能知道yarn session 主要还是隐藏的配置文件,但是配置文件可以被覆盖,多个session 保留最新的applicationid 1 安装flink (略) 2 启动sql-gatway(sql-gateway 通过官网介绍只能运行…

2022年JavaB组 试题 C: 字符统计

/*试题 C: 字符统计 * 时间限制: 1.0s 内存限制: 512.0MB 本题总分:10 分 * 【问题描述】 * 给定一个只包含大写字母的字符串 S,请你输出其中出现次数最多的字母。 * 如果有多个字母均出现了最多次,按字母表顺序依次输出所有这些字母。 * 【输…

YOLOv8改进 | 检测头篇 | 利用DBB重参数化模块魔改检测头实现暴力涨点 (支持检测、分割、关键点检测)

一、本文介绍 本文给大家带来的改进机制是二次创新的机制,二次创新是我们发表论文中关键的一环,本文给大家带来的二次创新机制是通过DiverseBranchBlock(DBB)模块来改进我们的检测头形成一个新的检测头Detect_DBB,其中DBB是一种重参数化模块,其训练时采用复杂结构,推理时…

#AIGC##LLM##RAG# RAG:专补LLMs短板_减少LLM幻觉并多模态/RAG 技术最新进展

RAG技术,即检索增强生成,标志着自然语言处理领域的重大进展。通过整合先前知识,它提升了大型语言模型的性能,广泛应用于多模态领域和垂直行业。本文深入探讨了RAG技术的演进历程、技术发展、LLMs问题及其解决方案,为读…

MySQL 8.0中引入的选项和变量(二)

以下是在MySQL 8.0中新增的系统变量、状态变量和服务选项: • Mysqlx_bytes_sent_compressed_payload: 发送的已压缩消息数据量,指的是在压缩之后的大小。在MySQL 8.0.19中引入。 • Mysqlx_bytes_sent_uncompressed_frame: 发送的未压缩消息数据量&…

前端笔试题(二)

1.常见的盒子水平垂直居中的方法有哪些 使用定位 使用margin:auto; display:flex; justify-content:center; align-items:center; 使用transform: translate(-50%,-50%); 2.简述下深浅拷贝的原理和常用的方法 浅拷贝 对于基本类型数据来说,拷贝的…

【RT-DETR有效改进】ShapeIoU、InnerShapeIoU关注边界框本身的IoU(包含二次创新)

前言 大家好,我是Snu77,这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进,内容持续更新,每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本,同时修改内容也支持Re…

十、Three场景实现多个物体的合并

Three场景实现多个物体的合并 目的 产品需求是让物体的光柱墙包含一个多边形的区域,二而我的多边形只能使用原型,方向,多边形。那么再研究的时候就需要将这些多边形合并成为一个形状,那么就行实现了。 原先的图形 如上图,是两个mesh组成的。首先寻找mesh合并的方法。 第…

分布式限流要注意的问题

本文已收录至我的个人网站:程序员波特,主要记录Java相关技术系列教程,共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源,让想要学习的你,不再迷茫。 为什么需要匀速限流 同学们回想一下在Guava小节里…

20240109金融读报1分钟小得

金融科技是基于大数据、云计算、人工智能、区块链等一系列技术创新。大数据作为金融分析的基石,人工智能为提升效率助力 金融发力点:科技金融、绿色金融、普惠金融、养老金融分别聚焦支持科技创新、绿色低碳、民生普惠、老年群体领域的金融服务和产品

MySQL运维篇(二)主从复制

一、概述 主从复制是指将主数据库的 DDL 和 DML 操作通过 二进制日志 传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。 MySQL 支持一台主库同时向多台从库进行复制, 从…

聊一聊 C# 的线程本地存储TLS到底是什么

一:背景 1. 讲故事 有朋友在后台留言让我说一下C#的 ThreadStatic 线程本地存储是怎么玩的?这么说吧,C#的ThreadStatic是假的,因为C#完全是由CLR(C)承载的,言外之意C#的线程本地存储&#xff…

基于Java+SSM+MYSQL的助农特色农产品销售系统详细设计和实现【附源码】

基于JavaSSM助农特色农产品销售系统详细设计和实现【附源码】 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定…

调试openjdk11源码报段错误异常Segmentation fault解决方案

解决方案-忽略信号:(gdb) handle SIGSEGV pass noprint nostop ##openjdk11源码编译简单教程 传送门centos7下openjdk11源码下载编译安装_openjdk11下载-CSDN博客 ##调试openjdk11源码报段错误异常Segmentation fault解决方案 Program received signal SIGSEGV,…

高防IP如何有效应对网站DDOS攻击

高防IP如何有效应对网站DDOS攻击?随着互联网的发展,网站安全问题变得越来越重要。DDoS攻击作为一种常见的网络攻击方式,给网站的稳定性和可用性带来了巨大威胁。而高防IP作为一种专业的网络安全解决方案,能够有效地应对DDoS攻击&a…

连接器应用案例详解 | prodesign加速卡采用Samtec NovaRay® 极高密度阵列

【摘要/前言】 ChatGPT最近受到的欢迎和关注凸显了人工智能在影响日常生活方面所取得的进展。 有谁曾使用 ChatGPT 完成家庭作业或撰写博客?提前申明:这一篇文章绝对是真人撰写~ 无论如何,像ChatGPT这样的聊天机器人和类似服务的支柱都是高…

芯片有关新闻-China chip imports suffer steepest drop on record after US curbs

Jan 16, 2024 9:01 am 由于长期的经济不确定性和美国的出口管制,中国的芯片进口去年遭遇了有记录以来的最大降幅。 全球最大半导体市场的集成电路进口额下降了15.4%,至3494亿美元,这是自2004年中国海关数据公布以来的最大跌幅,并…

数据库系统原理总结之——数据管理技术的发展

第八章 数据管理技术的发展 第八章 数据管理技术的发展一、数据库技术发展 ★★ 二、数据仓库 ★★★ 三、数据挖掘的功能 ★★★ 四、大数据的定义 ★★ 五、大数据存储 ★ 六、NoSQL 系统支持的数据存储模型 ★★★★ 七、MapReduce 技术 ★ 第八章 数据管理技术的发展

自适应动量因子梯度下降BP神经网络的人口预测

目录 摘要 BP神经网络参数设置及各种函数选择 参数设置 训练函数 传递函数 学习函数 性能函数 显示函数 前向网络创建函数 BP神经网络训练窗口详解 训练窗口例样 训练窗口四部详解 基于BP神经网络的租金预测 代码下载:bp数据人口预测.rar,(代码完整,数据齐全)资源-CSDN文…

Controller层自定义注解拦截request请求校验

一、背景 笔者工作中遇到一个需求,需要开发一个注解,放在controller层的类或者方法上,用以校验请求参数中(不管是url还是body体内,都要检查,有token参数,且符合校验规则就放行)是否传了一个token的参数&am…