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

作者 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

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

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

相关文章

使用JS来监控前端页面的性能!

说起性能测试, 我们很多时候都在说后端, 前端的性能测试, 我们关注较少. 那我们今天就来讨论一下如何来监控前端的性能.window.performance 是W3C性能小组引入的新的API,目前IE9以上的浏览器都支持。一个performance对象的完整结构如下图所示:memory字段…

【Spark-ML源码解析】Word2Vec

前言 在阅读源码之前,需要了解Spark机器学习Pipline的概念。 相关阅读:SparkMLlib之Pipeline介绍及其应用 这里比较核心的两个概念是:Transformer和Estimator。 Transformer包括特征转换和学习后的模型两种情况,用来将一个DataFr…

FastAdmin 的 icon (图标)文档

FastAdmin 的 icon (图标)文档 FastAdmin的icon使用的是font-awesome,凡是font-awesome的图标均可使用。 点击打开font-awesome的网址 js中的icon填写

自定义maven插件

maven插件简介 一般的maven插件使用时需要引入插件的gav(groupId,artifactId,version)就可以正常使用了。一般的结构如下&#xff1a; 包含插件的gav,还有一组可执行器<execution>。在每个<execution>里面包含有如下结构 一个可执行器的结构如上&#xff0c;其中各…

系统设计架构——互联网案例

Netflix 的技术栈 移动和网络:Netflix 采用 Swift 和 Kotlin 来构建原生移动应用。对于其 Web 应用程序,它使用 React。 前端/服务器通信:Netflix 使用 GraphQL。 后端服务:Netflix 依赖 ZUUL、Eureka、Spring Boot 框架和其他技术。 数据库:Netflix 使用 EV 缓存、Cas…

【线性代数】两个向量组等价,其中一个向量组线性无关,另一个向量组也是线性无关吗?

一、问题 两个向量组等价,其中一个向量组线性无关,另一个向量组也是线性无关吗? 二、答案 不一定,当两个向量组中的向量个数也相同时,结论才成立.若向量个数不相同,结论不成立. 例如&#xff1a; 向量组一&#xff1a;(1,0),(0,1) 向量组二&#xff1a;(1,0),(0,1),(1,1) 两…

超结MOS/低压MOS在5G基站电源上的应用-REASUNOS瑞森半导体

一、前言 5G基站是5G网络的核心设备&#xff0c;实现有线通信网络与无线终端之间的无线信号传输&#xff0c;5G基站主要分为宏基站和小基站。5G基站由于通信设备功耗大&#xff0c;采用由电源插座、交直流配电、防雷器、整流模块和监控模块组成的电气柜。所以顾名思义&#xf…

HarmonyOS应用开发实战—开箱即用的活动创建页面【ArkTS】【鸿蒙专栏-33】

一.HarmonyOS应用开发实战—开箱即用的个人主页页面【ArkTS】【鸿蒙专栏-32】 1.1 项目背景 HarmonyOS(鸿蒙操作系统)是华为公司推出的一种分布式操作系统。它被设计为一种全场景、全连接的操作系统,旨在实现在各种设备之间的无缝协同和共享,包括智能手机、平板电脑、智能…

安防监控EasyCVR平台如何通过api接口设置实时流的sei数据实现画框等操作?

国标GB28181视频监控系统EasyCVR平台采用了开放式的网络结构&#xff0c;支持高清视频的接入和传输、分发&#xff0c;能提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0…

【Transformer框架代码实现】

Transformer Transformer框架注意力机制框架导入必要的库Input Embedding / Out EmbeddingPositional EmbeddingTransformer EmbeddingScaleDotProductAttention(self-attention)MultiHeadAttention 多头注意力机制EncoderLayer 编码层Encoder多层编码块&#xff0f;前馈网络层…

mvn 指令报错 环境变量没问题----- jdk版本问题

有一个文件夹&#xff0c;里面mvn指令不能使用。mvn -version都会报错&#xff1a; 使用绝对地址也无法&#xff0c;设置权限也无法&#xff0c;到其上一层文件就可以正常使用。 于是我另外创建了个文件夹&#xff0c;把这个文件夹的所有东西全部复制进去&#xff0c;然后一个…

SpringBoot前后端分离开发项目部署时,项目打包准备工作

第一步&#xff1a;项目打包之前&#xff0c;拉前后端代码 拉完代码后&#xff0c;再执行下面操作&#xff08;确保项目能正常启动并运行&#xff09; 后端&#xff08;执行如下操作&#xff09; mvn clean install -T 8 -Dmaven.test.skiptrue -Dmaven.compile.forktrue 执行…

外汇天眼:在交易中有多少属于你的行情?

期货、股票、外汇不同的市场有着不同的特性&#xff0c;就一个市场而言&#xff0c;也不会是每一段行情都适合你。 新手完全是靠冲动和情绪交易 刚刚进入期货、股票、外汇市场的朋友都会被其巨大的财富效应所震慑&#xff1a;还有这样赚钱的&#xff1f; 而且机会比比皆是&am…

多个描述文件对开发者证书有影响吗

在开发iOS应用程序时&#xff0c;开发者证书是用于签名应用程序的关键工具。这一步骤保证了应用程序的合法性和安全性&#xff0c;避免了恶意篡改和未经授权的访问。那如果有多个描述文件会对开发者证书有影响吗。下面我简单的讲解一下他们之间的关系跟有什么影响。 首先&…

【STM32入门】4.2对射红外传感器计次

1.接线方式 主要是编写传感器的驱动、配合OLED&#xff0c;每遮挡对射红外传感器&#xff0c;OLED屏幕的计数就加一。 2.驱动编写 首先新建.c文件和.h文件&#xff0c;命名为CountSensor 国际惯例&#xff0c;.c文件内要包含stm32.h头文件&#xff0c;然后编写 CountSensor_…

3ds Max渲染贴图丢失?这样操作就能搞定!

当你在使用3ds Max进行渲染时&#xff0c;有时候会遇到贴图丢失的问题&#xff0c;导致模型无法正常显示。这可能是因为你在导入模型或添加贴图时出现了一些错误。不过不用担心&#xff0c;接下来我将向你解释这个问题可能出现的几种原因&#xff0c;同时提供有效的解决方案。 …

【力扣100】226.翻转二叉树

添加链接描述 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def invertTree(self, root: Optional[TreeN…

【机器学习】密度聚类:从底层手写实现DBSCAN

【机器学习】Building-DBSCAN-from-Scratch 概念代码数据导入实现DBSCAN使用样例及其可视化 补充资料 概念 DBSCAN&#xff08;Density-Based Spatial Clustering of Applications with Noise&#xff0c;具有噪声的基于密度的聚类方法&#xff09;是一种基于密度的空间聚类算…

CSharp中Blazor初体验

Blazor 是一个由微软开发的开源 Web 框架&#xff0c;用于构建富客户端 Web 应用程序使用 C# 语言和 .NET 平台。Blazor 允许开发人员使用 C# 语言来编写前端 Web 应用程序&#xff0c;而不需要像传统的 JavaScript 框架&#xff08;如 Angular、React 或 Vue.js&#xff09;那…

代码随想录算法训练营第二十一天 | 二叉树众数、公共祖先

目录 力扣题目 力扣题目记录 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 普通二叉树 搜索二叉树 236. 二叉树的最近公共祖先 总结 总结 力扣题目 用时&#xff1a;2h 1、530.二叉搜索树的最小绝对差 2、501.二叉搜索树中的众数 3、236. 二叉树的最近公共…