• ABAP 7.50 新特性 – Open SQL中的宿主表达式和其它表达式


    在长期的停滞后,Open SQL的发展终于从沉睡中醒来。从ABAP 7.40开始,SAP推进了某些关键的改变,以尽可能地包含SQL92中的特性,并提供与ABAP CDS中的DDL里面的SELECT一样的功能给Open SQL。为了实现这些目标,ABAP运行时环境中引入了一个新的SQL parser作为Open SQL的新基础。结果就是,Open SQL现在可以在ABAP中扮演一些和以往不同的角色了。

    虽然在7.40之前,Open SQL更多地被视为ABAP语言本身的一部分,但在同时,SQL关键字变得越来越介词化了。关于这点,主要的体现之一便是有关宿主变量的新规则。在7.40之前,你可以像在其它ABAP语句中使用ABAP变量那样在Open SQL中使用它们。实际上,这种自由阻止了更高效的开发。Open SQL语句在被转换为native SQL之后才会在数据库中运行。为了在WHERE条件中实现比简单比较更为复杂的东西,Open SQL parser必须能清晰的区分运算符两端的东西到底是ABAP变量、还是数据库内容,从而发送相应的内容给数据库。为了完成这一任务,Open SQL中的ABAP变量因此成为了完全的宿主变量host variables)。就像ABAP变量在native SQL中的成分一样(EXEC SQL)。你可以(而且应当)在Open SQL中的ABAP 宿主变量前加上转义符@实际上,只有这样做了,你才能使用ABAP 7.40版本之后的全部Open SQL新特性。Open SQL中引入的其它的基础修改也是为了让其更加适应未来,比如逗号分隔、以及将SELECT语句的INTO附加项放在authentic SQL子句的后面。(译注:authentic是什么意思没看懂,不过这句话的意思应当是指INTO语句不应是SQL本身的一部分,所以要放到后面以示区分)

    这些方法带来的第一个好处,已经在ABAP 7.40版本中放出,包括可以在不同操作数位置使用的SQL表达式,以及内联声明的可能性。在ABAP 7.50中,Open SQL依然在发展着,本文将介绍一些新特性(未来还会有更多)。

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

    原文标题:ABAP News for Release 7.50 – Host and Other Expressions in Open SQL

    宿主表达式

    在大多数可以放置宿主变量的地方,包含7.40版本以来的SQL表达式的操作数位置或者写SQL语句的工作区,现在可以通过如下方式放置宿主表达式(host expression):

    … @( abap_expression ) …

    宿主表达式abap_expression可以是任何ABAP表达式,可以是一个构造器表达式、表表达式、算术表达式、字符串表达式、bit表达式、内建函数、函数性的方法、或者是方法,它通过括号()包围起来,并且要加上前缀@。Open SQL中的宿主表达式从左到右计算,并且它们的结果会作为宿主变量传递给数据库。事实上,你可以将宿主表达式视为通过ABAP表达式为ABAP帮助变量赋值的简写。以下例子演示了一个表表达式,表达式从内表carriers中读取值,并放置在where条件右端:

    SELECT carrid, connid, cityfrom, cityto
           FROM spfli
           WHERE carrid =
             @( VALUE spfli-carrid( carriers[ KEY name
                                              carrname = name ]-carrid
                                              OPTIONAL ) )
           INTO TABLE @DATA(result)

    我个人喜欢下面的语句:

    DATA(rnd) = cl_abap_random_int=>create(
                   seed = CONV i( sy-uzeit ) min = 1 max = 100 ).
    
    INSERT demo_expressions FROM TABLE @(
       VALUE #(
        FOR i = 0 UNTIL i > 9
          ( id = i
            num1 = rnd->get_next( )
            num2 = rnd->get_next( ) ) ) ).

    这段代码构造了一个填充了随机数字的内表,接着在INSERT语句中用到了它。这是ABAP文档里面的一个很酷的demo程序。

    更多信息,请查看宿主表达式

    SQL表达式

    在ABAP 7.50 中,SQL表达式的使用得到了扩展:

    •  除了在SELECT列表中使用它们,你现在可以在WHERE, HAVING, ON和CASE的左手端作为CAST的操作数使用它们。注意,这会把包含的宿主变量和宿主表达式作为SQL表达式的操作数处理。
    • 以下SQL函数现可用于SQL表达式:ROUND, CONCAT, LPAD, LENGTH, REPLACE, RIGHT, RTRIM, SUBSTRING。而COALESCE函数的参数上限现在达到了255个。

    一个WHERE左手端的算术表达式示例:

    SELECT carrid, connid, fldate, seatsmax, seatsocc,
    
           seatsmax – seatsocc AS seatsfree
    
           FROM sflight
    
           WHERE seatsmax – seatsocc > @( meth( ) )
    
           INTO TABLE @DATA(result).

    通过字符串函数使用CONCAT将列拼接的例子:

    SELECT CONCAT( CONCAT( carrid,
    
                           LPAD( carrname,21,’ ‘ ) ),
    
                   LPAD( url,40,’ ‘ ) ) AS line
    
           FROM scarr
    
           INTO TABLE @DATA(result). 

    通过运算符&&拼接这样的字符串是不可以的。(译注:似乎是指&&只能用来拼接字符型的值)

    更多信息请看SQL表达式

    路径表达式

    路径表达式是一种你已经从CDS中了解过的概念。如果一个CDS视图暴露出关联相同的或者不同的视图可以通过路径表达式访问它。

    例如,下面的CDS视图在它的SELECT列表里面用到了路径表达式:

    @AbapCatalog.sqlViewName: ‘DEMO_CDS_USE_ASC’
    
    @AccessControl.authorizationCheck: #NOT_REQUIRED
    
    define view demo_cds_use_assocs
    
      with parameters p_carrid:s_carrid
    
      as select from demo_cds_assoc_scarr as scarr
    
    { scarr.carrname,
    
      scarr._spfli.connid,
    
      scarr._spfli._sflight.fldate,
    
      scarr._spfli._sairport.name }
    
    where scarr.carrid = :p_carrid 

    关联的名字以underscore_为前缀,并且通过如下的视图定义:

    @AbapCatalog.sqlViewName: ‘DEMO_CDS_ASC_CAR’
    
    @AccessControl.authorizationCheck: #NOT_REQUIRED
    
    define view demo_cds_assoc_scarr
    
      as select from scarr
    
                association to demo_cds_assoc_spfli as _spfli
    
                  on scarr.carrid = _spfli.carrid
    
         { _spfli,
    
           carrid,
    
           carrname }
    
    @AbapCatalog.sqlViewName: ‘DEMO_CDS_ASC_SPF’
    
    @AccessControl.authorizationCheck: #NOT_REQUIRED
    
    define view demo_cds_assoc_spfli
    
      as select from spfli
    
                association to sflight as _sflight
    
                  on spfli.carrid = _sflight.carrid and
    
                     spfli.connid = _sflight.connid
    
                 association [1..1] to sairport as _sairport
    
                  on spfli.airpfrom = _sairport.id
    
         { _sflight,
          _sairport,
    
           carrid,
    
           connid,
    
           airpfrom } 

    在ABAP 7.50中,访问CDS视图时,Open SQL的SELECT语句也可以在它的SELECT清单或者FROM子句中使用这样的路径表达式。下面的SQL语句实现了和上面的CDS视图一样的功能:

    SELECT scarr~carrname,
    
           \_spfli-connid AS connid,
    
           \_spfli\_sflight-fldate AS fldate,
    
           \_spfli\_sairport-name AS name
    
           FROM demo_cds_assoc_scarr AS scarr
    
           WHERE scarr~carrid = @carrid
    
           ORDER BY carrname, connid, fldate
    
           INTO TABLE @DATA(result).

    看起来区别不算大,是吧?唯一的就是点被反斜杠 代替了(因此,路径表达式看起来像那些meshes)。当编译这些Open SQL的时候,路径表达式将被转换为数据库中的join。可以在ST05中观察这点。

    更多信息请查看路径表达式

    其它新闻

    这不是有关ABAP 7.50中的Open SQL的全部信息。下篇文章我将会展示SELECT语句得到的增强,这使得INTO可以放置在SELECT后的末尾...

    参考阅读:ABAP 7.53 中的ABAP SQL(原Open SQL)新特性

                 ABAP 7.52 中的Open SQL新特性

         ABAP 7.40, SP08 中的Open SQL新特性

                      ABAP on SAP HANA

  • 相关阅读:
    如何下载文件
    线程方法wait()和notify()的使用
    多线程的同步问题
    线程
    线程上下文类加载器(Context ClassLoader)
    自定义ClassLoader的使用
    类加载器及其双亲委托机制
    类加载机制导致静态变量出错问题
    JAVA JVM助记符
    JVM调试说明
  • 原文地址:https://www.cnblogs.com/hhelibeb/p/7135899.html
Copyright © 2020-2023  润新知