sap 面向对象程序设计ABAP的SQL语句

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.

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ABAP中,可以使用ABAP Unit框架来测试SQL语句ABAP Unit是SAP提供的一个单元测试框架,可以用于测试ABAP程序的各个部分,包括SQL语句。 要测试SQL语句,首先需要创建一个测试类。在测试类中,可以使用ABAP Unit提供的断言方法来验证SQL语句的执行结果是否符合预期。 下面是一个示例代码,演示了如何使用ABAP Unit测试SQL语句: ``` CLASS lcl_sql_test DEFINITION FOR TESTING. PRIVATE SECTION. METHODS test_sql_statement. ENDCLASS. CLASS lcl_sql_test IMPLEMENTATION. METHOD test_sql_statement. DATA: lt_result TYPE TABLE OF <table_name>. " 执行SQL语句 EXEC SQL. SELECT * FROM <table_name> INTO TABLE @lt_result. ENDEXEC. " 使用断言方法验证结果 cl_abap_unit_assert=>assert_equals( act = lt_result, exp = <expected_result> ). ENDMETHOD. ENDCLASS. ``` 在上面的示例中,`<table_name>`是要测试的表名,`<expected_result>`是预期的结果。可以根据具体的测试需求,编写相应的SQL语句和断言方法来进行测试。 需要注意的是,在ABAP Unit中执行SQL语句时,需要使用`EXEC SQL`和`ENDEXEC`语句SQL语句包裹起来。 通过这种方式,可以方便地测试ABAP程序中的SQL语句,并确保其正确性。 #### 引用[.reference_title] - *1* *2* *3* [【ABAP】OPEN SQL(五)「INSERT语句 | UPDATE语句」](https://blog.csdn.net/weixin_59480481/article/details/129414288)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值