ABAP中的AMDP(ABAP-Managed Database Procedures )

摘要:
有关具体示例,请参见:AMDP、SQLScript与OpenSQL的比较、SAPHANA、,SQLScript AMDP的CurrencyConversion还可以提供以下好处:SQLScript的静态代码检查语法突出显示对AMDP中其他AMDP方法的访问ABAP字典的视图和表可以像普通ABAP方法一样调用,以使用ST22详细分析运行时错误视频简介:几种数据库访问方法之间的区别:在ABAP类型和数据库类型之间映射数据库对象存在数据库对象,以及为ABAP特定的环境信息使用位置列表。使用位置列表ABAP管理的数据库连接支持映射字段顺序、防止DDLClient处理、表缓存、表日志、CDSEntities等,。。。它将AMDP方法实现为表函数。

ABAP托管数据库过程(ABAP-Managed Database Procedure,以下简称AMDP)是在APAP on SAP HANA开发中的一种优化模式。AMDP使用数据库语言书写,比如Native SQL或者是SQL Script,并且在AMDP类的AMDP方法内实现。因此用它开发数据库过程就有点类似于编辑ABAP类。

简而言之,AMDP允许开发者直接在ABAP中写数据库过程。

本文链接:http://www.cnblogs.com/hhelibeb/p/7976533.html

转载请注明

为什么使用AMDP?

按SAP的官方建议,在可以使用Open SQL实现需要的功能或优化目标的时候,不建议使用AMDP。而在需要使用Open SQL不支持的特性,或者是大量处理流和分析导致了数据库和应用服务器之间有重复的大量数据传输的情况下,则应当使用AMDP。

具体的例子可以看看:AMDP, Comparison of SQLScript with Open SQL ,

          SAP HANA, Currency Conversion with SQLScript    

AMDP还能提供以下好处:

  • SQL Script的静态代码检查
  • 语法高亮(支持pretty printer格式优化器) 
  • 在AMDP内访问其它AMDP方法、ABAP字典的视图和表 
  • 可以像普通的ABAP方法一样调用(不包括AMDP function)  
  • 使用ST22进行运行时错误的详细分析    

介绍视频

几种数据库访问方式的区别(Open SQL, AMDP, ABAP-Managed Native SQL, Non-ABAP-Managed Native SQL):

 ABAP类型和数据库类型间的映射
数据库对象的存在Existence of the Database Objects,
ABAP特定的环境信息
使用位置列表Where-Used List
ABAP托管数据库连接支持Mapping of field order,
forbiddance of DDL
Client处理,
表缓存,
表日志,
CDS Entities, …
Open SQL Yes Yes Yes Yes
AMDP Yes Restricted Yes No
ABAP-Managed Native SQL Restricted Yes No No
Non-ABAP-Managed Native SQL No No No No

语法

AMDP在AMDP类中实现,需要一个标准的静态方法或者实例方法,可见性任意:

CLASS <my_amdp_class> DEFINITION.

  PUBLIC SECTION.
* 指定的Marker接口
  INTERFACES IF_AMDP_MARKER_<DB_TYPE>.
   ...
       
  METHODS <my_amdp_method>.
   ...
     
ENDCLASS.


CLASS <my_amdp_class> IMPLEMENTATION.

...

* AMDP 方法 
  METHOD <my_amdp_method> BY DATABASE PROCEDURE 
        FOR <db_type>
        LANGUAGE <db_language>
         OPTIONS <db_options>  
         USING   <db_entity>.
         
      "使用数据库语言实现存储过程
     ...

  ENDMETHOD.
    ...

ENDCLASS.

AMDP类就是普通的类,并实现IF_AMDP_MARKER_<DB_TYPE>接口。如果是HANA数据库,那么就是实现接口IF_AMDP_MARKER_HDB。不过,虽然原则上AMDP是为了支持各种数据库的存储过程而存在的,但到目前(ABAP 7.52)为止,AMDP只支持SAP HANA数据库。可以使用类CL_ABAP_DBFEATURES中的常量CALL_AMDP_METHOD来确认AMDP对当前数据库的支持情况。

简单示例

示例类CL_DEMO_AMDP_SCARR绑定了接口IF_AMDP_MARKER_HDB,并且包含AMDP方法SELECT_SCARR来从表SCARR中获取数据(笔者目前没有相应的环境,所以写了个ztest_amdp来代替示例):

CLASS ztest_amdp DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.
    INTERFACES if_amdp_marker_hdb.
    CLASS-DATA: scarr_tab TYPE ty_scarr.
    METHODS select_scarr IMPORTING VALUE(clnt)      TYPE mandt
                         EXPORTING VALUE(scarr_tab) TYPE ty_scarr.
ENDCLASS.


CLASS ztest_amdp IMPLEMENTATION.
  METHOD select_scarr
         BY DATABASE PROCEDURE FOR HDB
         LANGUAGE SQLSCRIPT
         OPTIONS READ-ONLY
         USING scarr.
    scarr_tab =
    SELECT *
           FROM "SCARR"
           WHERE mandt = clnt
           ORDER BY carrid;
  ENDMETHOD.
ENDCLASS.

以下代码可以用来调用方法、获取结果:

DATA result TYPE ty_scarr.

NEW ztest_amdp( )->select_scarr(
  EXPORTING clnt = sy-mandt
  IMPORTING scarr_tab = result ).

cl_demo_output=>display( result ). 

AMDP方法

AMDP方法有两种实现,一种是AMDP procedure实现;另一种是AMDP function实现。

AMDP procedure实现

需要使用Method语句的附加项BY DATABASE PROCEDURE。例子见上文。这种实现方式写成的方法和普通的ABAP对象方法在使用方式上没区别。

AMDP function实现

需要使用Method语句的附加项BY DATABASE FUNCTION。它将AMDP方法实现为一个table function。

tips: table function

  table function是只读的用户定义的方法,可以接收多个输入参数。接收单一的表返回值。

  在SQL Scitpt中,table function可以在与数据库表或者视图相同的位置使用。

示例代码:

REPORT demo_amdp_functions_inpcl.

CLASS demo DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS main.
ENDCLASS.

CLASS demo IMPLEMENTATION.
  METHOD main.
    IF NOT cl_abap_dbfeatures=>use_features(
          EXPORTING
            requested_features =
              VALUE #( ( cl_abap_dbfeatures=>call_amdp_method )
                       ( cl_abap_dbfeatures=>amdp_table_function ) ) ).
      cl_demo_output=>display(
        `System does not support AMDP or CDS table functions` ).
      RETURN.
    ENDIF.

    DATA carrid TYPE s_carr_id VALUE 'LH'.
    cl_demo_input=>request( CHANGING field = carrid ).
    carrid = to_upper( carrid ).

    "Database function selected in database procedure
    TRY.
        NEW cl_demo_amdp_functions_inpcl( )->select_get_scarr_spfli(
          EXPORTING clnt   = sy-mandt
                    carrid = carrid
          IMPORTING scarr_spfli_tab = DATA(result1) ).
      CATCH cx_amdp_error INTO DATA(amdp_error).
        cl_demo_output=>display( amdp_error->get_text( ) ).
        RETURN.
    ENDTRY.
cl_demo_output=>display( result1 ). ENDMETHOD. ENDCLASS. START-OF-SELECTION. demo=>main( ).

上面这个例子访问的AMDP function可以在类CL_DEMO_AMDP_FUNCTIONS_INPCL中看到。

方法GET_SCARR_SPFLI是一个AMDP function实现,它是不能直接在ABAP中访问的:

METHOD get_scarr_spfli BY DATABASE FUNCTION FOR HDB
                       LANGUAGE SQLSCRIPT
                       OPTIONS READ-ONLY
                       USING scarr spfli.
  RETURN SELECT sc.carrname, sp.connid, sp.cityfrom, sp.cityto
                FROM scarr AS sc
                  INNER JOIN spfli AS sp ON sc.mandt = sp.mandt AND
                                            sc.carrid = sp.carrid
                  WHERE sp.mandt = :clnt AND sp.carrid = :carrid
                  ORDER BY sc.mandt, sc.carrname, sp.connid;

ENDMETHOD.

而方法SELECT_GET_SCARR_SPFLI是一个AMDP procedure实现,它使用select从上面的function实现中获取数据。代码如下:

METHOD select_get_scarr_spfli
       BY DATABASE PROCEDURE FOR HDB
       LANGUAGE SQLSCRIPT
       OPTIONS READ-ONLY
       USING cl_demo_amdp_functions_inpcl=>get_scarr_spfli.
  SCARR_SPFLI_TAB =
  SELECT *
         FROM "CL_DEMO_AMDP_FUNCTIONS_INPCL=>GET_SCARR_SPFLI"(
                clnt => :clnt,
                carrid => :carrid );
ENDMETHOD.

也可以将AMDP function实现为CDS table function。这里就不贴示例了。

有关AMDP实现的视频教程

AMDP异常

AMDP procedure实现的异常名前缀是CX_AMDP。这些异常都在目录CX_DYNAMIC_CHECK之下,必须使用RASING显式地在AMDP procedure实现的定义中声明。

CX_ROOT
  |
  |--CX_DYNAMIC_CHECK
       |
       |--CX_AMDP_ERROR
           |
           |--CX_AMDP_VERSION_ERROR
           |    |
           |    |--CX_AMDP_VERSION_MISMATCH
           |
           |--CX_AMDP_CREATION_ERROR
           |    |
           |    |--CX_AMDP_CDS_CLIENT_MISMATCH
           |    |
           |    |--CX_AMDP_DBPROC_GENERATE_FAILED
           |    |
           |    |--CX_AMDP_DBPROC_CREATE_FAILED
           |    |
           |    |--CX_AMDP_NATIVE_DBCALL_FAILED
           |    |
           |    |--CX_AMDP_WRONG_DBSYS
           |
           |--CX_AMDP_EXECUTION_ERROR
           |    |
           |    |--CX_AMDP_EXECUTION_FAILED
           |    |
           |    |--CX_AMDP_IMPORT_TABLE_ERROR
           |    |
           |    |--CX_AMDP_RESULT_TABLE_ERROR
           |
           |--CX_AMDP_CONNECTION_ERROR
                |
                |--CX_AMDP_NO_CONNECTION
                |
                |--CX_AMDP_NO_CONNECTION_FOR_CALL
                |
                |--CX_AMDP_WRONG_CONNECTION

注意:AMDP function没有异常类。

工具支持

AMDP在SAP NetWeaver AS ABAP 7.40 SP05版本中被引入。只有基于Eclipse的开发工具(即ADT,版本要不低于2.19)才支持AMDP的编辑,SAP GUI上面的SE80是不提供编辑功能的,只能用来阅读代码。

调试工具情看这篇文章:Tutorial: How to Debug an ABAP Managed Database Procedure

有关AMDP调试的视频教程

总结

使用ABAP Managed Database Procedure(AMDP)和CDS开发,属于自上而下的ABAP for HANA开发方式。在应用层即ABAP程序中管理数据计算逻辑和建模,激活后会在HANA中创建相应的数据库对象。相比于旧有的Database Procedure Proxy,AMDP提供了简单的调用SQL Script等数据库语言的方式。

参考文章:

[1] AMDP - ABAP Managed Database Procedures

[2] ABAP Managed Database Procedures – Introduction

[3] ABAP Development for SAP HANA

[4] How to use AMDP Function implementation for a CDS Table Function as a data source in CDS views

[5] ABAP-Managed Database Objects and How to Access Them

其他资料:

SAP HANA SQL Script Reference

ABAP CDS Table Function介绍与示例

 

免责声明:文章转载自《ABAP中的AMDP(ABAP-Managed Database Procedures )》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SQLSERVER海量数据库的查询优化及分页算法数据库专栏,SQL Server (转)单词 统计下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

.net core ef 通过dbfirst方式连接sql server数据库

1. 创建基于.net core 的项目(过程略) 2. 使用nuget添加引用 Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.Tools Microsoft.EntityFrameworkCore.Design Microsoft.EntityFrameworkCore.SqlSe...

使用orapki生成证书,配置Oracle数据使用SSL和TLS进行数据库连接的TCP/IP配置==TCPS

内容参考Oracle官方文档:   https://oracle-base.com/articles/misc/configure-tcpip-with-ssl-and-tls-for-database-connections   https://docs.oracle.com/cd/E11882_01/network.112/e40393/asoappf...

Redis缓存设计和问题处理

工作中做的所有项目都用到了redis,对其设计思路和问题处理做个总结。 key设计:可读性高,定义简洁,不包含特殊字符,一般使用:分隔,比如user:info:1000001,表示id为1000001的缓存key value设计:字符串不宜过长,字符串最大是512M,一般来说超过10k我们就认为他是bigkey,集合,有序集合,哈希,个数不宜太多,比如存储...

PowerDesiGner数据库设计

原文地址:http://hi.baidu.com/shunkunl/blog/item/871c75ef8596faeace1b3e00.html PowerDesign:PowerDesign是 Sybase推出的主打数据库设计工具。PowerDesign致力于采用基于Entiry-Relation的数据模型,分别从概念数据模型 (Conceptual...

Sql Server 收缩日志文件原理及always on 下的实践

一、准备知识   1、LSN   LSN用来标识特定日志在日志文件中位置(详情请见什么是LSN:日志序列号),它由两部分组成:一部分用来标识VLF(虚拟日志文件)的序列号,剩下的用来标识该日志在VLF中的具体的位置。   根据LSN不同,日志一般分为两类:首日志(最新的活动日志序号)和尾日志(保留时间最长的活动日志序号)。随着数据库的操作不断增加(如数据库...

Linux搭建Java环境(JDK+Tomcat+MySQL)

目录 一、项目环境: 二、安装JDK1.8 三、安装Tomcat8.5 四、安装MySQL数据库 五、配置JAVA项目 一、项目环境: 开发环境 生产环境 测试环境 硬件环境: web服务器:cpu:intel i7,8G内存,金士顿1T固态硬盘,万兆网卡 数据库服务器:cpu:intel i7,8G内存,金士顿1T固态硬盘,万兆网卡...