2.3 ABAP的SQL语句
2.3.1 OPEN SQL简介
2.3.2 查询数据 select
SELECT result
INTO target
FROM source
[WHERE condition]
[GROUP BY fields]
[HAVING cond]
[ORDER BY fields].
在一个SQL语句中查询多个数据库表时可以使用JOIN语句,用于连接多个表,一般来说,JOIN使用主键和外键进行连接,也可以采用表的列匹配值进行连接,用ON关键字来指定连接条件,代码如下
SELECT s~carrid c~carrname
INTO TABLE gt_sflights
FROM sflight AS s
INNER JOIN scarr AS c
ON s~carrid EQ c~carrid
WHERE s~carrid <> ''.
ABAP查询的WHERE语句支持动态传入查询条件,即在运行时决定传入的条件,而不是将条件预先写在代码中,其用法与前面讲过的动态变量相同,代码如下:
" 设定条件语句的格式为:gv_field 列等于 变量 gv_value 的值
DATA gv_where TYPE c LENGTH 100.
DATA gv_field TYPE c LENGTH 50 VALUE 'carrid'.
DATA gv_operator TYPE c LENGTH 10 VALUE 'EQ'.
DATA gv_value TYPE c LENGTH 50 VALUE '''LH'''.
CONCATENATE gv_field gv_operator gv_value INTO gv_where SEPARATED BY space.
" 查询数据,动态传入条件语句,最多查询4条记录
SELECT carrid carrname cityfrom cityto UP TO 4 ROWS
FROM sflights
INTO CORRESPONDING FIELDS OF TABLE gt_sflights
WHERE (gv_where)
ORDER BY carrid DESCENDING.
ABAP 7.4SP05以上的ABAP版本提供了内联定义,采用关键字“@DATA”在代码中直接定义内表,可以简化内表的定义和引用。
SELECT *
FROM scarr
INTO TABLE @DATA(gt_scarr)
WHERE carrid = @gv_carrid.
2.3.3 插入数据
OPEN SQL可以使用INSERT语句将数据插入数据库的表中,常用的语法如下:
INSERT { {INTO target VALUES wa }
| { target FROM wa|{TABLE itab} } }.
插入数据库后,可以采用COMMIT WORK来将修改提交到数据库中,该语句可以提交当前SAP的事务LUW(Logical Unit of Work),更新系统数据库。
UPDATE dbtab|(dbtab_syntax) [CLIENT SPECIFIED]
[CONNECTION con|(con_syntax)]
{ {SET set_expression [WHERE sql_cond]}
| {FROM wa|{TABLE itab}} }.
2.3.4 更新数据 update
OPEN SQL可以使用UPDATE语句更新数据字典中已定义的数据库表中的数据,常用的语法如下:
" 用内表更新数据库表的一条数据
UPDATE scarr FROM gs_scarr.
" 用条件更新数据库表的一条或多条数据
UPDATE scarr
SET url = 'http://www.virginaustralia.com'
WHERE carrid = 'VA'.
2.3.5 删除数据 delete
" 用内表删除数据库表的一条数据
DELETE scarr FROM gs_scarr.
" 用条件删除数据库表的一条或多条数据
DELETE FROM scarr
WHERE carrid = 'VA'.
" 提交
COMMIT WORK.
2.3.6 修改数据 modify
" 将内表中的记录插入或更新到数据库表中
MODIFY scarr FROM TABLE gt_scarr.
" 提交
COMMIT WORK.
2.3.7 Native SQL简介
Native SQL能够直接访问数据库,有一定的安全风险,所以一般不推荐使用Native SQL。
2.3.8 HANA SQL Script简介
AP平台升级到HANA之后,SAP S/4HANA的数据库将固定为HANA内存数据库,随着数据库计算效率极大地提高,SAP推荐将复杂的逻辑从ABAP的应用服务器下沉到数据库服务器端,以充分利用内存数据库的性能优势。
SAP的HANA数据库所采用的SQL实现称为SQL Script(SQL脚本),是SAP对标准SQL的一种扩展实现
HANA中为了充分利用内存数据库的高性能,建议用户将逻辑下沉到数据库端,为此,SAP HANA提供了CDS(Core Data Services),CDS是可以预定义在HANA数据库端的视图。
简单来说,ABAP for HANA推荐的开发优先顺序为CDS>OPENSQL>AMDP调用HANA SQL Script存储过程>ADBC调用HANA NativeSQL。
在这里仅展示其中的一个ADBC调用HANA SQL Script查询语句的过程,如示例程序2.8。
其中,SUBSTRING、LENGTH等都是HANA SQL Script内置的SQL函数。
代码:
REPORT z000208.
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 CARRID, CARRNAME, CURRCODE, URL, |
&& | 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_query( lv_statement ).
" 调用SQL-set_param_table 方法,指定用哪个内表来记录返回结果
lo_result_set->set_param_table( lr_result ).
" 读取数据集的下一组数据到内表
lo_result_set->next_package( ).
" 得到结果后,关闭数据集
lo_result_set->close( ).
"打印内表
cl_demo_output=>display_data( lt_airline ).
"错误处理,如SQL有误,则在此处报出log,而不会导致系统崩溃(short dump)
CATCH cx_sql_exception INTO lx_sql.
WRITE: lx_sql->get_text( ).
ENDTRY.