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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿里巴巴分拆业务板块,中台架构已经死了吗?

阿里巴巴集团董事会主席兼首席执行官张勇发布全员信,宣布启动“16N”组织变革。在阿里巴巴集团之下,将设立阿里云智能、淘宝天猫商业、本地生活、菜鸟、国际数字商业、大文娱等六大业务集团和多家业务公司。 业务集团和业务公司分别成立董事会&#xff…

基于电源完整性的一些PCB设计建议

基于电源完整性的一些PCB设计建议 1. 尽量减少电源和地通路之间的环路电感,在相邻的层上分配电源和接地面时,使用尽可能薄的电介质; 2. 通过在平面之间使用尽可能高的介电常数来获得平面之间的最低阻抗,与尽可能薄的介电常数设计…

深入理解 Flink(七)Flink Slot 管理详解

1.JobMaster 注册成功之后开始调度 JobMaster 中封装了一个 DefaultScheduler,在 DefaultScheduler.startSchedulingInternal() 方法中生成 ExecutionGraph 以执行调度。 2.Flink 的资源管理机制 资源调度的大体流程如下: a.TaskExecutor 注册 Reg…

从CISC到RISC-V:揭开指令集的面纱

对于大多数同学来说,计算机或智能手机的运行似乎就像魔法一样神奇。你可能知道它们内部都是一些复杂的电子组件,比如CPU、内存等等,但这些组件是如何协同工作,让我们可以在电脑上打字,或者在手机上看视频呢&#xff1f…

matplotlib绘制动态瀑布图

绘制瀑布图思路:遍历指定文件目录下所有的csv文件,每读一个文件,取文件前20行数据进行保存,如果超过规定的行数300行,将最旧的数据删除,仅保留300行数据进行展示。 网上找的大部分绘制瀑布图的代码&#x…

ssh远程登录协议 搞定远程访问控制

远程管理linux系统基本上都要使用到ssh,原因很简单:telnet、FTP等传输方式是以明文传送用户认证信息,本质上是不安全的,存在被网络窃听的危险。SSH(Secure Shell)目前较可靠,是专为远程登录会话…

走迷宫(c语言)

前言: 制作一个迷宫游戏是一个有趣的编程挑战。首先,我们需要设计一个二维数组来表示迷宫的布局,其中每个元素代表迷宫中的一个格子。我们可以使用不同的值来表示空格、墙壁和起点/终点。接下来,我们需生成迷宫。在生成迷宫的过程…

智能手表喇叭无气孔导致老化播放后没声音

智能音箱喇叭老化播放后没声音 智能手表要做防水,在外壳上打了防水胶,结果出现播放突然没声音的现象. 原因 一直播放,设备温度升高,因为做了防水密闭导致喇叭腔体气压异常,导致播放没声音. …

nginx入门学习

nginx简介 nginx 是什么?用来干嘛的 通俗解释:客户端向服务器请求时,提供让多个服务器一起处理请求的东西 是一个反向代理服务器,能够提供负载均衡,和进行反向代理的功能 正向代理&反向代理 客户端向代理服务器请求&#…

短剧分销系统,助力短剧市场发展,实现短剧收益

近几年来,我国短剧兴起,在经过几年的蓄力后迎来了爆发期,短剧市场规模一路狂飙!短剧拥有节奏快、剧情“爽”的优势,成功占领了各大观众的碎片化时间,短剧已经成为了影视行业的新力量,也成为了当…

微服务概述之微服务特性

前言 既然系统采用了微服务架构,就需要了解一些微服务的特性,这样在进行微服务开发时,脑海中才会有一些指导方向。微服务具有以下特性。 1. 服务组件化 组件是独立、可替换、可升级的软件的单元。将整体应用拆分成独立的服务组件后&#xff…

嵌入式软件开发对硬件知识的掌握要求要多高?

嵌入式软件开发对硬件知识的掌握要求要多高? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家&#xff0…

并发编程(一)线程基础知识与线程控制

进程与线程 进程:如任务管理器中各种程序叫做正在运行的进程。对于操作系统来说,仅仅是一个数据结构,并不真实的执行代码 线程:真实执行代码的 每个进程启动的是时候会同步启动一个主线程即main函数,当main函数结束…

倒F天线设计经验分享

一、IFA天线理论分析 为了改善ILA天线难以使用的缺点,在ILA天线的基础上再增加一个倒L结构,形成IFA天线,此种天线体积小、易于匹配并具有双极化的特点,而在蓝…

帆软报表11.0.19增加postgres数据源方案

项目使用postgres数据库,帆软报表集成开发时需要手工增加该数据源。 https://help.fanruan.com/finereport/doc-view-2563.html 但增加数据源后测试报告无此驱动,经查看文档,现在是通过驱动管理来上传, 但新版又不允许上传驱动JAR…

外贸群发邮件最好的软件?群发软件哪个好?

外贸开发信群发软件推荐?做外贸用什么邮件群发软件? 在外贸业务中,与潜在客户建立联系并保持沟通是至关重要的。那么,如何快速有效地发送邮件给大量的潜在客户呢?这就涉及到了外贸群发邮件。蜂邮EDM来探讨一下&#x…

presto/trino 入门介绍实战

引言 Presto是一款分布式SQL查询引擎,它能够在大规模数据集上实现快速、交互式的查询。本文将介绍Presto的基本概念并结合一些实际的代码示例,能够让的大家快速入门并在实际项目中应用。 官网:Launch Presto: Local download, JDBC, Docker…

11.云原生分布式数据库之TIDB

云原生专栏大纲 文章目录 为什么使用TIDB后端视角运维视角基础架构视角 TiDB Operator 简介软件版本要求部署tidbTIDB工具helm常用命令TIDB学习推荐资料 为什么使用TIDB 从后端视角、运维视角和基础架构视角来看,使用 TiDB 作为数据库系统可以获得分布式架构、高可…

目标检测应用场景—数据集【NO.25】牛行为检测数据集

写在前面:数据集对应应用场景,不同的应用场景有不同的检测难点以及对应改进方法,本系列整理汇总领域内的数据集,方便大家下载数据集,若无法下载可关注后私信领取。关注免费领取整理好的数据集资料!今天分享…

云原生微服务之分布式锁框架 Redisson

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 系列专栏目录 [Java项目…