ABAP使用AMDP调用HANA存储过程

更多内容关注公众号:SAP Technical

欢迎关注微信公众号:SAP Technical

数据建模在SAP HANA视图中完成,需要读取视图的输出并将其保留在HANA表中。编写存储过程以从HANA视图读取数据并将数据插入HANA表。

存储库存储过程'DATA_PERSIST'是在TEST包下通过HANA开发透视图创建的。此存储过程从HANA视图读取数据,并将数据进入“XYZ”模式下的表中。

 

我们创建的view都会在_SYS_BIC模式中创建存储过程。在该过程中,可以给出默认模式。这里,给出的默认模式是“XYZ”,因为Table1和Table2是在此模式下创建的。

在Calmonth上创建了一个输入参数。在这里,将传递calmonth值,然后基于此计算HANA视图结果。

这是读写过程,如下面的脚本所示。只读语句已被删除。

在该过程的第一部分中,'STARTIME'变量用于将当前时间戳值保存为'YYYYMMDD HH24:MI:SS'格式。创建第二个变量以保存值'COMMIT'。

注 - AMDP(Abap托管数据库过程)不支持Commit,rollback等语句。因此,通过解决方法实现同样的目的。

在第二部分中,数据插入table1中。Table1用于记录和跟踪过程的运行日期,程序运行所花费的时间。

稍后,我们将根据将传递给存储过程的calmonth从HANA视图ABC_CV中读取数据。(这将在步骤2中的Abap类中显示)。结果插入表2中。表1和表2在XYZ模式下。

在存储过程结束时,使用过程的结束时间戳更新Table1(日志记录表)。这有助于跟踪存储过程的每次运行。

2.在此步骤中,将创建一个Abap类来调用存储过程。这是通过Abap视角在HANA工作室中创建的。

在方法“Datapersist”类下,声明了游标C_DATE,它保存最后15个月的calmonth。这里的要求是仅存储最近15个月的数据。该数据每天被删除,每天加载15个月的数据。没有实施增量/变更记录机制。

另一个存储过程“_SYS_BIC”。调用“TEST :: DATA_TRUNCATE”,删除Table2中的数据。这会丢弃table2中的数据。

使用For循环,calmonth逐个传递给存储过程。因此,使用此方法,通过逐个传递calmonth来调用存储过程15次。这是因为HANA视图非常复杂并且生成了大量数据。在运行时,HANA视图可能会占用大量内存和CPU,因此运行会根据每个月进行拆分,而不是同时运行15个月。

加载数据后,调用另一个存储过程“_SYS_BIC”。“TEST :: DATA_MERGE”。这是合并表2的增量,以按照SAP的建议将数据从增量存储移动到HANA中的主存储。

下面是用Abap类编写的代码。在Abap类中,可以调用存储过程,也可以在Abap类中编写整个代码。

3.一个Abap程序Z_Data_daily是在BW开发人员的角度下开发的,用于调用Abap类/方法,如下所示。现在,Abap程序可以调用上面创建的类。

<think>好的,我现在需要帮助用户了解在ABAP AMDP中如何正确使用系统变量。首先,我需要回顾一下用户提供的引用内容,特别是引用[3],里面提到了SESSION_CONTEXT函数和三个全局会话变量:CLIENT、APPLICATIONUSER、LOCALE_SAP。用户的问题是如何在AMDP使用这些系统变量,所以我需要详细说明方法步骤。 首先,应该明确AMDP方法的结构,因为用户可能需要知道如何定义AMDP方法。引用[2]提到AMDP方法是在ABAP类中定义的,使用BY DATABASE PROCEDURE和LANGUAGE SQLSCRIPT。所以,在方法定义时需要注意这些关键字。 接下来,系统变量的访问方式。引用[3]指出可以使用SESSION_CONTEXT函数来获取变量值,比如CLIENT对应客户端,APPLICATIONUSER是当前用户,LOCALE_SAP是语言设置。这里需要具体说明如何在SQLScript中调用这个函数,并赋值给变量。可能需要用SELECT语句或者直接赋值? 然后,用户可能需要示例代码来更好地理解。引用[3]中的示例方法展示了如何获取这三个变量,但代码中有一些符号错误,比如>应该是>,需要纠正。此外,变量的声明和类型也需要解释清楚,比如clnt、unam、lang的类型是否与ABAP中的类型对应,比如CLIENT可能是CHAR(3),而APPLICATIONUSER可能是STRING。 另外,需要注意AMDP方法的调用方式。引用[2]提到可以像普通ABAP方法一样调用AMDP方法,所以用户可能需要知道如何传递参数或者处理返回值。但在这个具体问题中,系统变量是直接从会话中获取的,可能不需要参数传递,但需要确保方法正确访问这些变量。 还需要提到权限或上下文的问题,比如AMDP方法执行时是否自动携带了ABAP环境中的这些变量值,是否有必要在调用前设置某些参数。引用[3]提到ABAP运行时环境会填充这些变量,所以用户可能不需要额外操作,直接使用SESSION_CONTEXT即可。 另外,错误处理方面,引用[2]提到可以使用事务ST22分析运行时错误,所以如果在使用系统变量时出现问题,应该引导用户查看ST22日志。 最后,是否需要考虑不同数据库的兼容性?但根据引用[2],AMDP在SAP HANA使用SQLScript,所以可以专注于HANA的环境。 总结步骤应该是: 1. 创建AMDP类和方法,使用正确的语法。 2. 在方法体内使用SESSION_CONTEXT函数获取变量。 3. 处理这些变量,比如存储到本地变量或用于查询。 4. 调用方法并测试,处理可能出现的错误。 同时,用户可能需要了解如何声明变量,是否需要使用DECLARE语句,或者在SQLScript中直接赋值。例如,在方法内部,可以这样写: clnt := SESSION_CONTEXT('CLIENT'); 但需要确保变量已经声明,或者在SELECT语句中使用。此外,是否需要处理变量类型转换的问题? 可能还需要提醒用户,AMDP方法必须符合特定的结构,比如使用BY DATABASE PROCEDURE,并且在类中标记为AMDP方法。引用[1]提到如何判断一个类是AMDP类,可能涉及到CLAS的定义,但用户的问题更多是关于变量使用,这部分可能不需要深入,但可以简要提及。 现在需要将这些思路整理成结构化的回答,分步骤说明,并给出示例代码。同时,确保LaTeX格式正确,行内公式用$...$,独立公式用$$...$$,但在这个问题中可能用不到数学公式,但如果有变量名或其他代码,需要正确转义。 最后,生成相关问题,比如如何调试AMDP中的系统变量,或者如何处理多客户端的情况,或者如何与其他ABAP对象交互等。</think>在ABAP AMDP使用系统变量需通过SQLScript内置的$SESSION_CONTEXT$函数实现。以下是具体步骤和示例: ### 一、AMDP方法定义规范 1. 使用`BY DATABASE PROCEDURE`声明方法类型 2. 指定数据库语言为`SQLSCRIPT` 3. 在方法内部通过`SESSION_CONTEXT`访问变量[^3] ```abap CLASS zcl_amdp_demo DEFINITION PUBLIC. PUBLIC SECTION. METHODS: get_client_info BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT USING sflight. ENDCLASS. ``` ### 二、系统变量调用方法 三个核心系统变量: - `CLIENT`:客户端编号(对应ABAP的`sy-mandt`) - `APPLICATIONUSER`:当前用户(对应`sy-uname`) - `LOCALE_SAP`:语言代码(对应`sy-langu`) ```sqlscript METHOD get_client_info BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT. DATA(lv_client) = session_context('CLIENT'); DATA(lv_user) = session_context('APPLICATIONUSER'); SELECT * FROM sflight WHERE mandt = :lv_client AND carrid IN (SELECT carrid FROM scarr WHERE created_by = :lv_user); ENDMETHOD; ``` ### 三、技术要点说明 1. **变量类型自动转换** ABAPHANA数据类型自动映射,如`CLIENT(char 3)`对应ABAP的`sy-mandt(clnt)` 2. **上下文继承机制** AMDP运行时自动继承ABAP会话的: - 用户身份验证 - 客户端设置 - 语言环境[^3] 3. **调试方法** 通过事务码`ST22`查看ABAP运行时错误日志,使用`ADBC`测试SQL脚本语句[^2] ### 四、完整应用示例 ```abap CLASS zcl_amdp_report IMPLEMENTATION. METHOD generate_report BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT USING zcust, zsales. DATA(lv_cur_client) = session_context('CLIENT'); DATA(lv_cur_user) = session_context('APPLICATIONUSER'); CREATE LOCAL TEMPORARY TABLE #temp_data AS ( SELECT c.name, s.sales_amount FROM zcust AS c JOIN zsales AS s ON c.id = s.cust_id AND s.mandt = :lv_cur_client WHERE c.created_by = :lv_cur_user ); CALL CLIENT_COPY(:lv_cur_client, #temp_data); ENDMETHOD. ENDCLASS. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值