ABAP与HANA集成 2:ABAP调用HANA存储过程或SQL语句

news2024/11/25 6:56:50

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

需求

虽然是做BW模块,但是最近项目上种种,都需要给ABAP人员或者前台用户提供能供他们使用的表,就稍微研究了下ABAP和HANA的集成问题,因为我们BW更擅长的还是HANA,而且HANA的运行效率也会比ABAP层面快很多,这次举一个简单的需求,就是我在HANA有一段存储过程,是执行一段SELECT语句,并且把数据存到一个透明表,供ABAP开发去使用。

原理

通过标准的ABAP类去调用HANA的存储过程,在ABAP层面去触发执行HANA的存储过程,这个方法是一个同事告诉我的,特别感谢张同学。先说下原理,主要是用到一个标准类CL_SQL_CONNECTION下的方法GET_CONNECTION,我的理解就是用来连接数据库,并且调用数据库的语句。

类的代码如下:感兴趣的朋友可以再研究一下

具体步骤

需求是调用存储过程,那我们得先创建一段存储过程,直接在HANA对应的目录下执行语句,创建即可,上一段我的代码,就是很简单的把某个视图的数据插入到透明表中,这样abap就可以使用了

create procedure "SAPHANADB".ZBW_insert_ZCV_DT_BPCas
/********* Begin Procedure Script ************/
BEGIN
trunca tetable "SAPHANADB"."ZCV_DT_BPC";
insert into "SAPHANADB"."ZCV_DT_BPC"
SELECT
"RLDNR",
"RBUKRS",
"GJAHR",
"BELNR",
"DOCLN",
"TIME",
CASEWHEN"ACCOUNT"ISNULLTHEN''ELSE"ACCOUNT"ENDAS"ACCOUNT",
"ENTITY",
"ENTITY_TEXT",
"INTERCO",
"INTERCO_TEXT",
"AUDITTRAIL",
"CATEGORY",
"SCOPE",
"RHCUR",
"RWCUR",
"TYPE",
"MISC",
"KUNNR",
"KIDNO",
"ZZYLIU6",
"ZZYLIU11",
"VTWEG",
CASEWHEN"FLOW"ISNULLTHEN''ELSE"FLOW"ENDAS"FLOW",
CASEWHEN"ZHBHB"ISNULLTHEN''ELSE"ZHBHB"ENDAS"ZHBHB", 	
CASEWHEN"ZLOGIC_CODE"ISNULLTHEN''ELSE"ZLOGIC_CODE"ENDAS"ZLOGIC_CODE", 
CASEWHEN"ZLOGIC_VALUE"ISNULLTHEN''ELSE"ZLOGIC_VALUE"ENDAS"ZLOGIC_VALUE", 
"RSTGR",
"RFAREA",
"DRCRK",
"RASSC",
"MATKL",
CASEWHEN"MATKL_HB"ISNULLTHEN''ELSE"MATKL_HB"ENDAS"MATKL_HB",
CASEWHEN"CODE_QD_D"ISNULLTHEN''ELSE"CODE_QD_D"ENDAS"CODE_QD_D",
CASEWHEN"CODE_QD_E"ISNULLTHEN''ELSE"CODE_QD_E"ENDAS"CODE_QD_E",
"RACCT",
"RMVCT",
CASEWHEN"LAND1"ISNULLTHEN''ELSE"LAND1"ENDAS"LAND1",
CASEWHEN"REGION"ISNULLTHEN''ELSE"REGION"ENDAS"REGION",
"ZZYLIU10",
"MATNR",
CASEWHEN"MATNR_TEXT"ISNULLTHEN''ELSE"MATNR_TEXT"ENDAS"MATNR_TEXT",
"BTTYPE",
"ZDATE",
CASEWHEN"PSPID"ISNULLTHEN''ELSE"PSPID"ENDAS"PSPID",
CASEWHEN"AUFNR"ISNULLTHEN''ELSE"AUFNR"ENDAS"AUFNR",
CASEWHEN"ZZYLIU9"ISNULLTHEN''ELSE"ZZYLIU9"ENDAS"ZZYLIU9",
CASEWHEN"ATTRIBUTE1"ISNULLTHEN''ELSE"ATTRIBUTE1"ENDAS"ATTRIBUTE1",
CASEWHEN"ATTRIBUTE2"ISNULLTHEN''ELSE"ATTRIBUTE2"ENDAS"ATTRIBUTE2",
CASEWHEN"ATTRIBUTE3"ISNULLTHEN''ELSE"ATTRIBUTE3"ENDAS"ATTRIBUTE3",
CASEWHEN"HKONT_SR"ISNULLTHEN''ELSE"HKONT_SR"ENDAS"HKONT_SR",
CASEWHEN"HKONT_CB"ISNULLTHEN''ELSE"HKONT_CB"ENDAS"HKONT_CB",
"ANLN1",
sum("HSL") AS"HSL",
sum("WSL") AS"WSL",
sum("MSL") AS"MSL"
FROM"_SYS_BIC"."ZP_DFYH_BW.ZP_LL/COPYOFZCV_DT_BPC"
WHERE"RBUKRS"IN('YH10','YH20','YH12') 
GROUPBY"RLDNR",
"RLDNR",
"RBUKRS",
"GJAHR",
"BELNR",
"DOCLN",
"TIME",
CASEWHEN"ACCOUNT"ISNULLTHEN''ELSE"ACCOUNT"END,
"ENTITY",
"ENTITY_TEXT",
"INTERCO",
"INTERCO_TEXT",
"AUDITTRAIL",
"CATEGORY",
"SCOPE",
"RHCUR",
"RWCUR",
"TYPE",
"MISC",
"KUNNR",
"KIDNO",
"ZZYLIU6",
"ZZYLIU11",
"VTWEG",
CASEWHEN"FLOW"ISNULLTHEN''ELSE"FLOW"END,
CASEWHEN"ZHBHB"ISNULLTHEN''ELSE"ZHBHB"END, 	
CASEWHEN"ZLOGIC_CODE"ISNULLTHEN''ELSE"ZLOGIC_CODE"END, 
CASEWHEN"ZLOGIC_VALUE"ISNULLTHEN''ELSE"ZLOGIC_VALUE"END, 
"RSTGR",
"RFAREA",
"DRCRK",
"RASSC",
"MATKL",
CASEWHEN"MATKL_HB"ISNULLTHEN''ELSE"MATKL_HB"END,
CASEWHEN"CODE_QD_D"ISNULLTHEN''ELSE"CODE_QD_D"END,
CASEWHEN"CODE_QD_E"ISNULLTHEN''ELSE"CODE_QD_E"END,
"RACCT",
"RMVCT",
CASEWHEN"LAND1"ISNULLTHEN''ELSE"LAND1"END,
CASEWHEN"REGION"ISNULLTHEN''ELSE"REGION"END,
"ZZYLIU10",
"MATNR",
CASEWHEN"MATNR_TEXT"ISNULLTHEN''ELSE"MATNR_TEXT"END,
"BTTYPE",
"ZDATE",
CASEWHEN"PSPID"ISNULLTHEN''ELSE"PSPID"END,
CASEWHEN"AUFNR"ISNULLTHEN''ELSE"AUFNR"END,
CASEWHEN"ZZYLIU9"ISNULLTHEN''ELSE"ZZYLIU9"END,
CASEWHEN"ATTRIBUTE1"ISNULLTHEN''ELSE"ATTRIBUTE1"END,
CASEWHEN"ATTRIBUTE2"ISNULLTHEN''ELSE"ATTRIBUTE2"END,
CASEWHEN"ATTRIBUTE3"ISNULLTHEN''ELSE"ATTRIBUTE3"END,
CASEWHEN"HKONT_SR"ISNULLTHEN''ELSE"HKONT_SR"END,
CASEWHEN"HKONT_CB"ISNULLTHEN''ELSE"HKONT_CB"END,
"ANLN1";
END/********* End Procedure Script ************/

创建好存储过程后,要把技术名称copy下来,后面需要使用

接下来在abap层面,也就是GUI中SE38创建程序,直接copy下面这段代码即可,需要替换的地方我后面会标注出来

REPORT ZBW_EXECUTE_HANA_PROC.
PARAMETERS:ZVARIANT(2550) TYPE C. "存储过程
DATA remote_exception  TYPE REF TO CX_SFW_REMOTE_ERROR.
DATA msg TYPE c LENGTH 255.
DATA:ZRESULT(10) TYPE C.
TYPES:
     BEGIN OF result_t,
        key TYPE i,
        value TYPE string,
     END OF result_t.

DATA: stmt_ref TYPE REF TO cl_sql_statement,
      cx_sql_exception TYPE REF TO cx_sql_exception,
      lv_text TYPE string,
      res_ref TYPE REF TO cl_sql_result_set,
      d_ref TYPE REF TO DATA,
      result_tab TYPE TABLE OF result_t,
      result_line TYPE result_t,
      row_cnt TYPE i,
      con_ref TYPE REF TO cl_sql_connection.

TRY.
        con_ref = cl_sql_connection=>get_connection( 'DBMS_USER_MGT' ).
        stmt_ref = con_ref->create_statement( ).

         CONCATENATE 'CALL  ' ZVARIANT ' ()' into  lv_text .

*         lv_text = 'CALL  "CRRC"."CRRC.PRO::SP_CRRC_D" ()'.
         stmt_ref = con_ref->create_statement( ).
         res_ref = stmt_ref->execute_query( lv_text ).
         con_ref->COMMIT( ).

  CATCH CX_SFW_REMOTE_ERROR INTO remote_exception.
    msg = remote_exception->get_text( ).
    WRITE / msg.
ENDTRY.

下面是需要更改的地方,其实主要就是HANA的链接名称,以及存储过程的技术名称,LV_TEXT中,其实就是HANA中调用存储过程的语句,LV_TEXT这里其实就是HANA CALL FOUNCION的完整语句,我理解其实除了存储过程,别的语句也可以执行,比如增删改查,或者一些赋值的代码

HANA的链接名称通过TCODE DBCO去查询

上面的程序创建后,激活执行就可以使用了,作为BW开发也可以把他放到处理链里去作业调度

更详细的参考链接如下:开发者日志:ABAP通过辅助数据库连接HANA | SAP Blogs

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

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

相关文章

什么是 DDoS ?如何识别DDoS?怎么应对DDOS攻击

什么是DDOS攻击 DDoS攻击(Distributed Denial of Service Attack)即分布式拒绝服务攻击,是一种利用分布式网络来发起大量的请求,占用目标服务器或网络资源的攻击行为。这种攻击方式可以瘫痪目标系统,导致其无法正常提供…

TensorFlow 2 和 Keras 之间的区别总结

1、什么是TensorFlow 2 TensorFlow 2是谷歌开源的一款深度学习框架,于2019年发布,并且在同年10月1日发布了TensorFlow 2.0.0正式稳定版。这款框架被很多企业与创业公司广泛用于自动化工作任务和开发新系统。 TensorFlow 2在分布式训练支持、可扩展的生…

MATLAB - 使用 MPC Designer 线性化 Simulink 模型

系列文章目录 前言 本主题介绍如何使用 MPC Designer 对 Simulink 模型进行线性化。为此,请从包含 MPC 控制器块的 Simulink 模型打开该应用程序。本例中使用 CSTR_ClosedLoop 模型。 open_system(CSTR_ClosedLoop) 在模型窗口中,双击 MPC 控制器模块。…

了解 SBOM (软件物料清单)

近年来,开源软件在开发中的采用激增,目前已占已构建软件的高达 90%。它在全球公司中的受欢迎程度源于成本节约和产品上市时间的加快。然而,在集成开源软件组件时,有一个关键的方面需要考虑。 Synopsys 报告84% 的商业和专有代码库…

未来十年,人工智能就业方向及前景如何?

人工智能(AI)是一个快速发展的领域,对于未来的就业方向和前景有着巨大的影响。以下是一些可能的发展趋势和就业前景: 1、增长趋势:人工智能正在全球范围内经历巨大的增长,预计在未来十年内将继续保持这一趋…

rn报错 run react-native-start,rn真机报错bug解决

错误信息 这个问题是因为手机和电脑没有链接起来需要实行通讯 ADB ADB (Android Debug Bridge) ,译作 安卓调试桥 ,一个能让你 与Android设备进行通信 的 命令行工具 。 你可以通过它,在命令行输入命令控制Android设备,或者查看…

【map】【单调栈 】LeetCode768: 最多能完成排序的块 II

作者推荐 【贪心算法】【中位贪心】.执行操作使频率分数最大 涉及知识点 单调栈 排序 map 区间合并 题目 给你一个整数数组 arr 。 将 arr 分割成若干 块 ,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。 返回…

【Spring】11 EnvironmentAware 接口

文章目录 1. 简介2. 作用3. 使用3.1 创建并实现接口3.2 配置 Bean 信息3.3 创建启动类3.4 启动 4. 应用场景总结 Spring 框架为开发者提供了丰富的扩展点,其中之一就是 Bean 生命周期中的回调接口。本文将着重介绍一个与环境(Environment)相关…

uniapp 预览图片

preImg(index){let urls []this.images.map((item,i) > {if(indexi){urls.unshift(item.file_path)}else{urls.push(item.file_path)}})uni.previewImage({urls})}

探索关系:Python中的Statsmodels库进阶

目录 写在开头1. 多元线性回归场景介绍 2. Logistic回归2.1 Logistic回归的概念2.2 应用案例2.2.1 建立模型和预测2.2.2 模型结论2.2.3 模型优化 3. 时间序列分析3.1 时间序列分析中的应用3.2 利用Statsmodels进行简单的时间序列分析 写在最后 写在开头 在数据分析的旅程中&am…

【react】原理简介

一、setState() 的说明 1.1 更新数据 setState() 是异步更新数据的注意:使用该语法时,后面的 setState() 不要依赖于前面的 setState()可以多次调用 setState() ,只会触发一次重新渲染 1.2 推荐语法 推荐:使用 setState((sta…

C++内存布局

温故而知新,本文浅聊和回顾下C内存布局的知识。 一、c内存布局 C的内存布局主要包括以下几个部分: 代码段:存储程序的机器代码。.数据段:存储全局变量和静态变量。数据段又分为初始化数据段(存储初始化的全局变量和…

深入解析Guava范围类(Range)

第1章:范围类Range的重要性 大家好,我是小黑,今天咱们聊聊一个在Java编程世界里非常实用但又被低估的角色——Guava库中的Range类。你知道吗,在处理涉及到数值范围的问题时,Range类就像是咱们的救星。不论是判断某个数…

Redis设计与实现之订阅与发布

目录 一、 订阅与发布 1、 频道的订阅与信息发送 2、订阅频道 3、发送信息到频道 4、 退订频道 5、模式的订阅与信息发送 ​编辑 6、 订阅模式 7、 发送信息到模式 8、 退订模式 三、订阅消息断连 1、如果订阅者断开连接了,再次连接会不会丢失之前发布的消…

SiLM5350MDBCA-DG车规级隔离驱动芯片,我们能为汽车智能提供什么?

SiLM5350MDBCA-DG是一款适用于IGBT、MOSFET的单通道 隔离门极驱动器,具有10A拉电流和10A灌电流驱动能 力。提供内部钳位功能,可单独控制 上升时间和下降时间。 在 SOP8 封 装 中 具 有 3000VRMS 隔 离 耐 压 ( 符 合 UL1577)。 与…

MySQL数据库 约束

目录 约束概述 外键约束 添加外键 删除外键 删除/更新行为 约束概述 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。 目的:保证数据库中数据的正确、有效性和完整性。 分类: 注意:约束是作用于表中字段上…

使用 GBASE南大通用 ADO.NET

GBASE南大通用ADO.NET(全称是 .NET Framework Data Provider For GBase)提 供给.NET 应用程序访问 GBase 数据库、获取数据、管理数据的一套完整的解决 方案。 GBASE南大通用 ADO.NET 的四个核心类及若干功能类具有以下功能:  建立和管…

喜报|亚数荣获“2023物联网场景应用品牌企业”奖项

12月5日至6日,以“物联中国 数智雄安”为主题的“千企雄安行:2023物联网产业品牌大会”在雄安新区举办。 大会由雄安新区管理委员会、中关村发展集团股份有限公司、物联中国团体组织联席会主办,雄安新区投资促进服务中心、北京物联网智能技术…

layui框架实战案例(25):table组件筛选列记忆功能

即点击当前表格右上角筛选图标后,对表头进行显示隐藏勾选,再刷新页面依然保留当前筛选状态。 要实现layui表格组件的筛选列记忆功能,可以采取以下步骤: 存储筛选数据:当用户进行筛选操作时,将筛选的数据…

leecode-LCR 017. 最小覆盖子串(golang版本)

leecode最小覆盖字串 leecode链接地址 给定两个字符串 s 和 t 。返回 s 中包含 t 的所有字符的最短子字符串。如果 s 中不存在符合条件的子字符串,则返回空字符串 “” 。 如果 s 中存在多个符合条件的子字符串,返回任意一个。 题解 func minWindow(…