2.3.9 SAP HANA SQL Script简介 - 摘自 《SAP ABAP面向对象程序设计:原则、模式及实践》

《SAP ABAP面向对象程序设计:原则、模式及实践》

https://book.douban.com/subject/30317853/

http://www.duokan.com/shop/tbt/book/179473

https://item.jd.com/12423999.html

https://e.jd.com/30429611.html

2.3.9 HANA SQL Script简介

传统的ABAP开发,一般是将数据从数据库中读取到ABAP的应用服务器中,经过ABAP程序的计算后,进行前端展现并存回数据库。

而SAP平台升级到HANA之后,SAP S/4HANA的数据库固定为HANA内存数据库,随着数据库计算效率的极大地提高, SAP推荐将复杂的逻辑从ABAP的应用服务器下沉到数据库服务器端,以充分利用内存数据库的性能优势。

SAP S/4 HANA可以采用前端ABAP调用数据库端的程序进行业务逻辑计算,然后再通过ABAP程序直接读取计算结果,有效解决了数据输入输出瓶颈,提高了计算效率。

SAP的HANA数据库的采用的SQL实现称为SQL Script (SQL脚本),是SAP对标准 SQL语言的一种扩展实现。

这种本地SQL(Native SQL)支持用户将将复杂的逻辑下沉到到高性能的HANA数据库中,从而提高系统的计算能力。SQL Script 就是HANA数据库所支持的SQL语言的实现。

ABAP for HANA提供了AMDP接口用于调用HANA端的基于SQL Script的存储过程,或者ABAP可以调用CDS视图(CDS View)等预定义在HANA数据库端的视图,这样能够极大地提高运算效率。

扫描二维码关注公众号,回复: 3559184 查看本文章

 

使用SQL Script的好处主要是:

  1. 可以分利用内存数据库的性能优势,在SAP HANA数据库中执行复杂的计算和业务逻辑。
  2. 避免大批量的数据在数据库和ABAP应用层上传递,使用SQL Script脚本代替单个查询,可以同时返回多个值,降低I/O瓶颈。
  3. 可以在数据库层实现复杂的逻辑控制,一个SQL的函数或存储过程可以进一步分解为更小的函数。 SQL Script脚本可以提供在单个的SQL语句中不可实现的控制逻辑。

 

HANA中为了充分利用内存数据库的高性能,建议用户将逻辑下沉到数据库端,为此,SAP HANA提供了CDS (Core Data Services),CDS是可以预定义在HANA数据库端的视图。

CDS提供了一个基于SQL的层,其扩展了SQL-92的标准,可以对传统的OLTP和OLAP模型的进行统一的数据定义,数据查询和数据操作。

ABA程序中通过OPEN SQ语句可以访问CDS,从而更加容易地访问HANA数据库。

HANA中为了能够调用NATIVE SQL,也提供了ADBC (ABAP Database Connectivity) 接口,ADBC是一个基于面向对象的应用接口,用于HANA的数据库连接,SQL语句的执行和异常管理。

 

在SAP 的S/4 HANA开发中,对于一般的应用,ABAP for HANA开发有以下的建议:

  1. 如果需要查询的数据可重用,使用CDS和OPEN SQL又可以实现相同的功能,就选择使用CDS。
  2. 如果数据库中还没有创建相应的CDS,而且功能是不需要重用的,可以使用OPEN SQL。
  3. 如果前两项都不适用,则可以在HANA数据库中创建存储过程(SQL Script Stored Procedure)处理业务,然后ABAP采用AMDP接口调用HANA的存储过程。
  4. 如果前几项都不适用,则选择ADBC调用HANA的Native SQL。

简单来说,ABAP for HANA推荐的开发顺序为1. CDS > 2. OPEN SQL > 3. AMDP 调用HANA SQL Script存储过程 > 4. ADBC 调用 HANA Native SQL。

对于SAP HANA的开发,有机会我们再系统地讨论。本书注重的是在SAP ECC和S4/HANA平台上都适用的SAP ABAP面向对象程序设计。所以我们这里仅展示其中的一个ADBC调用HANA SQL Script查询语句的过程,如示例程序2.8 (系统环境为SAP HANA S/4 1610)。

SUBSTRING,LENGTH 等都是HANA SQL Script的内置的SQL 函数。

"示例程序2.8(HANA)

"本程序为SAP HANA 1610版本
REPORT zrep_cls_hana03.

TYPES:
  
"设定内表和工作区结构体的类型
  
BEGIN OF ty_airline,
    airline_id  
TYPE scarr-carrid,
    airline_name 
TYPE scarr-carrname,
    airline_currency 
TYPE scarr-currcode,
    url 
TYPE scarr-url,
    url2 
TYPE string,
  
END OF ty_airline.

"设定承载SQL语句的变量,返回结果变量,条件变量
DATA:
  lv_statement 
TYPE string,
  lt_airline 
TYPE TABLE OF ty_airline,
  lr_result 
TYPE REF TO data,
  lv_currency 
TYPE scarr-currcode,

"设定ADBC相关类的连接对象,SQL对象,结果对象,异常对象的变量
  lo_conn 
TYPE REF TO cl_sql_connection,
  lo_statement 
TYPE REF TO cl_sql_statement,
  lo_result_set 
TYPE REF TO cl_sql_result_set,
  lx_
sql TYPE REF TO cx_sql_exception.

"关联内表到结果对象变量中
GET REFERENCE OF lt_airline INTO lr_result.

"设定条件变量的值
lv_currency 
'EUR'.

拼接HANA NATIVE SQL,该语法是 HANA  SQL Script支持的语法
也可以调用SQL Script的函数如 SUBSTRING 
 lv_statement 
SELECT CARRIDCARRNAMECURRCODEURL,  |
&& | SUBSTRING 
(URL,8,LENGTH(URL)AS URL2 |
&& | 
FROM scarr WHERE currcode '{ lv_currency }' and |
&& | CARRID <> 
'CA' |.

TRY.
  
调用SQL-Connection方法,连接到数据库
  lo_conn 
cl_sql_connection=>get_connection( ).
  
调用SQL-Statement方法,创建SQL对话
  lo_statement 
lo_conn->create_statement( ).
  
调用SQL-query 方法,执行SQL语句
  lo_result_set 
lo_statement->execute_querylv_statement ).
  
调用SQL-set_param_table 方法,指定用那个内表来记录返回结果
  lo_result_set
->set_param_tablelr_result ).
  
读取数据集的下一组数据到内表
  lo_result_set
->next_package( ).
  
得到结果后,关闭数据集
  lo_result_set
->close( ).

"打印内表
cl_demo_output
=>display_datalt_airline ).
"错误处理,如SQL有误,会在此处报出log,而不会系统崩溃(short dump
  
CATCH cx_sql_exception INTO lx_sql.
  
WRITElx_sql->get_text( ).
ENDTRY.

   

如图2-16所示,程序运行结果如下。

 

 

 

猜你喜欢

转载自www.cnblogs.com/techtalk/p/9782311.html
今日推荐