• ABAP 7.52 中的Open SQL新特性


    S/4 HANA 1709 已经在几个月前发布,随之而来的是ABAP 7.52。

    本文翻译了更新文档中有关Open SQL的部分。

    如果读者是Open SQL的新手,请不要从本文看起。更合适的教程是:A complete guide to OpenSQL statements – Step-by-step tutorial with screenshots

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

    1,内表作为数据源

    现在可以将内表指定为查询语句的数据源。如果内表数据需要传递给数据库的话,则只能在部分数据库上运行。

    例子:

    DATA itab TYPE HASHED TABLE OF scarr
              WITH UNIQUE KEY mandt carrid.
    
    IF NOT cl_abap_dbfeatures=>use_features(
             EXPORTING
               requested_features =
                 VALUE #( ( cl_abap_dbfeatures=>itabs_in_from_clause ) ) ).
      cl_demo_output=>display(
        `System does not support internal tables as data source` ).
      RETURN.
    ENDIF.
    
    itab =  VALUE #( ( carrid = 'LH' carrname = 'L.H.' )
                     ( carrid = 'UA' carrname = 'U.A.' ) ).
    
    SELECT scarr~carrid, scarr~carrname, spfli~connid
           FROM @itab AS scarr
             INNER JOIN spfli ON scarr~carrid = spfli~carrid
           INTO TABLE @DATA(result)
           ##db_feature_mode[itabs_in_from_clause].
    
    cl_demo_output=>display( result ).

    2,关系表达式

    条件表达式现支持以下情况:

    • 可以对字符类数据类型大小比较,并且不再限制N类型。
    • 操作符BETWEEN不再限制N类型,SQL表达式现在可以在右侧使用了。
    • 现在也支持LIKE操作符。

    3,转换函数

    新的类型转换函数BINTOHEXHEXTOBIN现在可以在SQL表达式中把byte strings转换为character strings,这种功能在CAST表达式中是不可行的。

    示例程序,可以看到两种转换方式的结果是一样的:

     SELECT SINGLE id AS uuid32, hextobin( id ) AS uuid16
           FROM iwreferenc
           WHERE tcode = 'SE38'
           INTO @DATA(wa).
    
    IF sy-subrc = 0.
      DATA uuid16 LIKE wa-uuid16.
      cl_system_uuid=>convert_uuid_c32_static(
        EXPORTING
          uuid          =     wa-uuid32
        IMPORTING
          uuid_x16      =     uuid16 ).
      ASSERT wa-uuid16 = uuid16.
    ENDIF.

    4,路径表达式

    以下特性现在在路径表达式(path expression)中可用:

    • 在传参的空白部分、属性方括号的空白部分和斜杠前的位置,路径表达式可以分割为多个代码行。
    • 目标数据也是CDS表函数(table function)的时候,也可以使用Association了。
    • 参数可以在路径表达式association的后面传递。由此可以指定带有参数的CDS entities作为association的数据源。
    • 在路径表达式中,现在可以指定join表达式的cardinality和类型作为属性。
    • association的过滤条件现在可以在路径表达式中指定。

    5,访问控制

    新的关键字WITH PRIVILEGED ACCESS可以关闭CDS的访问控制

    6,子查询中的ORDER BY和UP TO, OFFSET

    在子查询中,现在可以使用ORDER BY子句和附加项UP TO, OFFSET了。不过,不是所有数据库都支持在子查询中运行ORDER BY。

    注意:在子查询中,UP TO只能用在ORDER BY子句后面,附加项OFFSET也只能在UP TO后面指定。

    7,LFET OUT JOIN中的Cardinality

    在LFET OUTER JOIN中,可以用附加项ONE TO MANY指定Cardinality。它可以被SAP HANA识别为一种优化说明。

    8,SELECT列表中的FOR ALL ENTRIES IN和字符串

    在先前的严格模式语法检查中,SELECT语句的附加项FOR ALL ENTRIES IN不能和SELECT列表中类型为STRING和RAWSTRING或者LCHR和LRAW的列一起出现。现在这个限制已经被移除,语法检查只会对此提示一个警告,而不是错误。

    9,严格模式的语法检查

    如果你用到了上面列出的Open SQL中的任一新特性,语法检查会以严格模式运行。

    10,Client处理

    在切换Client读取CDS entities时,附加项USING CLIENTCLIENT SPECIFIED会应用以下(更严格的)规则:

    • CDS访问控制不会在跨Client访问时工作。因此,附加项USING CLIENTCLIENT SPECIFIED只能在CDS entities的访问控制被关闭的时候使用,即注解为AccessControl.authorizationCheck.#NOT_ALLOWED,或者查询语句中使用了上文5中的WITH PRIVILEGED ACCESS时。
    • 路径表达式只能在自动Client处理打开的时候使用。不可以使用CLIENT SPECIFIED,以防路径表达式中的association中的FROM子句中的目标数据是指定Client(Client-specific)的数据源(?),association的源数据源也不可以是指定客户端的。

    11,Open SQL中的代理服务

    CL_OSQL_REPLACE可以在ABAP Unit单元测试中将数据库访问重定向至访问其它数据库的Open SQL。

    该类只能在测试类中使用。

    示例程序:DEMO_CL_OSQL_REPLACE

    相关阅读:ABAP 7.50 新特性

           ABAP 7.40, SP08 中的 Open SQL 新特性

           ABAP 7.53 中的ABAP SQL(原Open SQL)新特性

  • 相关阅读:
    java学习笔记(三)
    JAVA 学习笔记(2)
    java学习笔记
    第二次作业完成情况
    第一次作业完成情况
    使用MarkDown标记语言发博客
    《Java高级程序设计》第一周作业
    纪逝去的毕业后的两年时光
    #这是来联系Markdown语法的
    CodeFirst初体验——问题三
  • 原文地址:https://www.cnblogs.com/hhelibeb/p/7941300.html
Copyright © 2020-2023  润新知