当前位置: 首页 > news >正文

ABAP AMDP 是一项什么技术?

1. 背景介绍

AMDP是ABAP Managed Database Procedure 的缩写,译为ABAP托管数据库过程

AMDP 将 HANA 数据库的 SQLScript 功能集成到 ABAP 中,允许在 ABAP 类中创建和调用托管数据库过程。

2. 什么时候使用AMDP技术?

AMDP的特性在于,数据处理的push-down,也即将处理逻辑下沉到数据库端执行,这样减少ABAP和数据库间的交互,从何获得更好的性能。

但并不是所有场景都适合使用AMDP技术。因为相较于传统的ABAP代码,AMDP需要开发人员了解HANA以及SQLScript技术,同时AMDP程序的调试不如ABAP程序直观简单,例如需要借助HANA studio等工具完成performance trace等。而且在运维时,AMDP代码与ABAP代码混合在一个类中,导致代码的可读性下降,加剧了运维的难度。

SAP的官方建议:在可以使用Open SQL实现需要的功能或优化目标的时候,不建议使用AMDP。而在需要使用Open SQL不支持的特性 (例如原生HANA SQL的一些功能,比如fuzzy search),或者是大量处理流和分析导致了数据库和应用服务器之间有重复的大量数据传输的情况下(例如对于海量数据进行汇总、过滤、排序),则应当使用AMDP。

3. AMDP的实现

ABAP在 7.4 SP05后提供了AMDP技术的支持,具体的实现方式很简单,通过实现一个IF_AMDP_MARKER_HDB接口即可,虽然原则上AMDP是可以做成类似OSQL这种对不同数据库的支持,但到目前,其只支持SAP HANA数据库(个人感觉,以后应该也不会做对其他数据库的扩展了,let’s see…)。

实现了IF_AMDP_MARKER_HDB接口的类,我们可以称之为AMDP类。

AMDP类中,可以包含普通的方法,可以包含AMDP方法,AMDP方法在实现时会通过BY DATABASE PROCEDURE...BY DATABASE FUNCTION...这样的关键字标识,这样这个特殊的method,就可以做为AMDP实现的容器了。

AMDP方法的管理是在ABAP服务器上进行的,包括:

  • 通过ADT进行AMDP源代码的编辑
  • 对应SQLScript代码的静态语法检查以及语法高亮
  • 存储过程procedure的创建会在第一次调用时,在DB上进行deploy
  • 对于运行时错误,可以用ST22进行监控
  • 对于AMDP的传输与普通ABAP对象是一样的
    在这里插入图片描述

例如, 下面是一个AMDP类的示例伪代码, 我们来介绍下AMDP的基础语法:

CLASS ZCL_AMDP_SAMPLE DEFINITION.PUBLIC SECTION.INTERFACES IF_AMDP_MAKER_HDB.* Only ABAP code possible:METHODS process IMPORTING it_param TYPE type1EXPORTING et_param TYPE type2.* Only SQLScript possible:METHODS execute IMPORTING VALUE(it_param) TYPE type1EXPORTING VALUE(et_param) TYPE type2.                    
ENDCLASS.CLASS ZCL_AMDP_SAMPLE IMPLEMENTATION.METHOD process." any abap code here...ENDMETHOD. METHOD execute BY DATABASE PROCEDURE / DATABASE FUNCTIONFOR db_platformLANGUAGE db_language[OPTIONS READ-ONLY]USING name1 name2 etc...-- Write SQLScript code here...select * from dummy;ENDMETHOD.
ENDCLASS.

3.1 AMDP方法的参数:

对于AMDP method,其参数有一定的限制,必须是数据库支持的数据类型。可以是简单的标量类型(如INT4、DECIMAL、CHAR等)或表类型。

  • 例如对于table类型的参数,其必须使用基于TABLE TYPE定义的表类型,且列的定义必须与数据库支持的格式一致。表参数的类型需要使用LINE TYPE明确其结构。类型必须在ABAP字典(Data Dictionary,DDIC)中维护(比如通过DDIC中的类型或表定义)。
  • AMDP method的参数不支持FIELD-SYMBOLDATA REFERENCE类型作为参数。
  • 对于STRING 类型,要注意,STRING 类型不能用于声明数据库内部表结构(即 TABLE 类型字段不能是 STRING 类型)。对于 AMDP 方法中的参数,STRING 类型只能用于传递或返回值,不能直接用作数据库操作的表列值。ABAP 的 STRING 类型 会映射到 SAP HANA 数据库的 NVARCHAR 类型(可变长度 Unicode 字符串)。STRING:动态长度(可超过 255)。数据库限制:NVARCHAR 的最大长度为 5000 个字符。如果参数长度可能超过 5000 字符,直接使用 STRING 会引起数据截断,需要使用 CLOB 类型或其他可扩展方案。
  • AMDP的参数必须声明为值引用

3.2 Database Procedure vs. Database Function

对于AMDP方法的实现部分,BY DATABASE PROCEDUREBY DATABASE FUNCTION 是用于区分 AMDP 的实现形式使用目的的关键字。

  • Database Procedure: 是一个数据库存储过程,存储过程通常用作一系列SQLScript语句操作的容器,能够执行复杂的逻辑,可以返回结果集,并支持IN/OUT参数。具体来说,其支持 IMPORTING (输入参数)EXPORTING (输出参数)、不支持CHANGING (输入输出参数) ,不支持RETURNING参数。
  • Database Function: 是一种数据库函数,用于执行某些操作,并返回一个明确的标量值(通常是单一值)或特定的表值(table type)。也即,仅支持RETURNING参数,返回值可以是标量值(如INT4,CHAR)或者表类型(定义在 DDIC 中的结构表)。不支持 EXPORTING 和 CHANGING 参数。

3.3 其它关键字

  • FOR db_platform: 指定数据库平台。目前仅支持HDB 表示 SAP HANA 数据库。
  • LANGUAGE db_language: 指定编写存储过程的脚本语言。在 SAP HANA 上,系统支持 SQLScript,因此这里指定 SQLSCRIPT
  • OPTIONS READ-ONLY: 指定数据处理选项。READ-ONLY表示方法不会修改数据库中的数据,只能读取。如果省略,则可能允许写操作,但这种定义要谨慎。该选项有助于优化存储过程的执行。

4 示例

4.1 使用Database Procedure完成批量更新

示例场景:根据输入的员工数据,将新员工插入数据库表。如果该员工已存在,则更新其信息。

代码实现:

CLASS zcl_amdp_employee_update DEFINITION.PUBLIC SECTION.INTERFACES if_amdp_marker_hdb. " 标记接口METHODS update_employee_dataIMPORTING it_employee_data TYPE STANDARD TABLEEXPORTING ev_status         TYPE STRING. " 批处理状态
ENDCLASS.CLASS zcl_amdp_employee_update IMPLEMENTATION.METHOD update_employee_data BY DATABASE PROCEDUREFOR HDBLANGUAGE SQLSCRIPT.-- 批量更新或插入员工数据DECLARE lv_count INT; -- 计数器,用于跟踪批量处理的记录数量-- 遍历所有传入的数据FOR cur_employee IN :it_employee_data DO-- 对现有数据执行更新操作UPDATE zemployeeSET FirstName = cur_employee.FirstName,LastName = cur_employee.LastName,Department = cur_employee.DepartmentWHERE EmployeeID = cur_employee.EmployeeID;-- 如果数据不存在 (更新未成功),则插入新数据IF ROW_COUNT = 0 THENINSERT INTO zemployee (EmployeeID, FirstName, LastName, Department)VALUES (cur_employee.EmployeeID,cur_employee.FirstName,cur_employee.LastName,cur_employee.Department);END IF;-- 记录处理的记录数lv_count = lv_count + 1;END FOR;-- 返回处理状态ev_status = 'Processed records: ' || lv_count;ENDMETHOD.ENDCLASS.

在ABAP代码中调用AMDP方法:

DATA: lt_employee_data TYPE TABLE OF zemployee,lv_status        TYPE string.lt_employee_data = VALUE #(( EmployeeID = 'E001' FirstName = 'John'  LastName = 'Doe'    Department = 'IT' )( EmployeeID = 'E002' FirstName = 'Jane'  LastName = 'Smith'  Department = 'HR' )
).CALL METHOD zcl_amdp_employee_update=>update_employee_dataEXPORTINGit_employee_data = lt_employee_dataIMPORTINGev_status         = lv_status.WRITE: / lv_status.

4.2 使用Database Function完成复杂数据的聚合

示例场景:计算特定部门的员工工资总额和人数。

代码实现:

CLASS zcl_amdp_salary_function DEFINITION.PUBLIC SECTION.INTERFACES if_amdp_marker_hdb. " 标记接口METHODS get_salary_statisticsIMPORTING iv_department  TYPE stringRETURNING VALUE(rv_stats) TYPE string. " 返回工资统计
ENDCLASS.CLASS zcl_amdp_salary_function IMPLEMENTATION.METHOD get_salary_statistics BY DATABASE FUNCTIONFOR HDBLANGUAGE SQLSCRIPT.-- 返回值是一个字符串,格式为:人数 | 工资总额RETURN SELECTCOUNT(*) || ' | ' || SUM(Salary)FROM zemployee_salaryWHERE Department = :iv_department;ENDMETHOD.ENDCLASS.

在ABAP代码中调用AMDP:

DATA: lv_statistics TYPE string.CALL METHOD zcl_amdp_salary_function=>get_salary_statisticsEXPORTINGiv_department = 'IT'RETURNINGrv_stats       = lv_statistics.WRITE: / lv_statistics. " 示例结果:'25 | 100000'

5 小结

本文介绍了ABAP AMDP的基本概念和用法,在接下来的文章中,会进一步介绍如何debug AMDP,以及一些其他技巧。

http://www.dtcms.com/a/334471.html

相关文章:

  • 深入理解Java虚拟机(JVM):架构、内存管理与性能调优
  • MongoDB 聚合提速 3 招:$lookup 管道、部分索引、时间序列集合(含可复现实验与 explain 统计)
  • 片料矫平机·第四篇
  • Element Plus 中 el-input 限制为数值输入的方法
  • 暴雨服务器:以定制化满足算力需求多样化
  • 深入剖析跳表:高效搜索的动态数据结构
  • 【测试工具】OnDo SIP Server--轻松搭建一个语音通话服务器
  • 社保、医保、个税、公积金纵向横向合并 python3
  • 深入理解 Vue Router
  • Centos7.9安装Dante
  • 04时间复杂度计算方法
  • Python 桌面应用形态后台管理系统的技术选型与方案报告
  • Linux系统之lslogins 命令详解
  • vector 手动实现 及遇到的各种细节问题
  • 深入剖析 TOTP 算法:基于时间的一次性密码生成机制
  • Golang分布式事务处理方案
  • 如何在win服务器中部署若依项目
  • JVM垃圾回收器
  • 深度解析Java synchronized关键字及其底层实现原理
  • python学习DAY43打卡
  • C++实战
  • 如果构建企业本地的ERP智能ai系统,让先进的大模型数据处理ERP的各类数据,更加轻松智能,准确?从企业资源计划ERP变成企业资源智能EPA的升级
  • CUDA 编程笔记:CUDA内存模型概述
  • 【数据库】Oracle学习笔记整理之五:ORACLE体系结构 - 参数文件与控制文件(Parameter Files Control Files)
  • 虚拟专用网技术
  • Gradle#构建生命周期三个阶段
  • PyTorch神经网络工具箱(如何构建神经网络?)
  • 基于几何平面的寻路算法:SPEV1Auxiliary全面解析
  • 数据库Microsoft Access、SQL Server和SQLite三者对比及数据库的选型建议
  • Win11家庭版docker安装Minio