在长期的停滞后,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 = max = ). INSERT demo_expressions FROM TABLE @(
VALUE #(
FOR i = UNTIL i >
( 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,,’ ‘ ) ),

               LPAD( url,,’ ‘ ) ) 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

ABAP 7.50 新特性 – Open SQL中的宿主表达式和其它表达式的更多相关文章

  1. ABAP 7.50 新特性之另一个CORRESPONDING

    在ABAP中,存在着一条法则:同样的名称代表的不一定是同样的东西(具体可看最近的相关讨论). 但是如你们所知的,存在着一个很好的例外: 所有涉及到使用CORRESPONDING为结构赋值的关键字的语法 ...

  2. 11g新特性-自动sql调优(Automatic SQL Tuning)

    11g新特性-自动sql调优(Automatic SQL Tuning) 在Oracle 10g中,引进了自动sql调优特性.此外,ADDM也会监控捕获高负载的sql语句. 在Oracle 11g中, ...

  3. Java8新特性(一)_interface中的static方法和default方法

    什么要单独写个Java8新特性,一个原因是我目前所在的公司用的是jdk8,并且框架中用了大量的Java8的新特性,如上篇文章写到的stream方法进行过滤map集合.stream方法就是接口Colle ...

  4. java8新特性:interface中的static方法和default方法

    java8中接口有两个新特性,一个是静态方法,一个是默认方法. static方法 java8中为接口新增了一项功能:定义一个或者多个静态方法. 定义用法和普通的static方法一样: public i ...

  5. 手把手教你如何用java8新特性将List中按指定属性排序,过滤重复数据

    在java中常常会遇到这样一个问题,在实际应用中,总会碰到对List排序并过滤重复的问题,如果List中放的只是简单的String类型过滤so easy,但是实际应用中并不会这么easy,往往List ...

  6. 【Java8新特性】接口中的默认方法和静态方法,你都掌握了吗?

    写在前面 在Java8之前的版本中,接口中只能声明常量和抽象方法,接口的实现类中必须实现接口中所有的抽象方法.而在Java8中,接口中可以声明默认方法和静态方法,本文,我们就一起探讨下接口中的默认方法 ...

  7. 【Java8新特性】- 接口中默认方法修饰为普通方法

    Java8新特性 - 接口中默认方法修饰为普通方法 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学 ...

  8. 【Java8新特性】你知道Java8为什么要引入Lambda表达式吗?

    写在前面 这是一道真实的面试题,一个读者朋友出去面试,面试官竟然问他这样一个问题:你说说Java8中为什么引入Lambda表达式?引入Lambda表达式后有哪些好处呢?还好这个朋友对Java8早有准备 ...

  9. Oracle 11g 中SQL性能优化新特性之SQL性能分析器(SQLPA)

    Oracle11g中,真实应用测试选项(the Real Application Testing Option)提供了一个有用的特点,叫SQL性能分析器(SQL Performance Analyze ...

随机推荐

  1. SQL Server 怎么在分页获取数据的同时获取到总记录数

    SQL Server 获取数据的总记录数,有两种方式: 1.先分页获取数据,然后再查询一遍数据库获取到总数量 2.使用count(1) over()获取总记录数量 SELECT * FROM ( SE ...

  2. c# dllimport 调用函数,参数乱码

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalA ...

  3. [Linux] Nginx响应压缩gzip

    压缩和解压缩 .本节介绍如何配置响应的压缩或解压缩以及发送压缩文件. gzip on; .NGINX仅使用MIME类型text / html压缩响应 gzip_types text/plain app ...

  4. springMVC_03注解完成hello案例

    1.导入jar包 commons-logging-1.1.1.jar jackson-annotations-2.5.4.jar jackson-core-2.5.4.jar jackson-data ...

  5. python使用udp实现聊天器

    聊天器简易版 使用udp实现一个简单的聊天器程序,要求如下: 在一个电脑中编写1个程序,有2个功能 1.获取键盘数据,并将其发送给对方 2.接收数据并显示 并且功能数据进行选择以上的2个功能调用 例子 ...

  6. JavaScript是如何工作的:Web Workers的构建块 + 5个使用他们的场景

    摘要: 理解Web Workers. 原文:JavaScript是如何工作的:Web Workers的构建块 + 5个使用他们的场景 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 这 ...

  7. JS之onunload、onbeforeunload事件详解

    简介 onunload,onbeforeunload都是在刷新或关闭时调用,可以在<script>脚本中通过 window.onunload来调用.区别在于onbeforeunload在o ...

  8. Vue2+VueRouter2+webpack 构建项目实战(二):目录以及文件结构

    通过上一篇博文<Vue2+VueRouter2+webpack 构建项目实战(一):准备工作>,我们已经新建好了一个基于vue+webpack的项目.本篇文章详细介绍下项目的结构. 项目目 ...

  9. P1993 小 K 的农场

    题目描述 小 K 在 Minecraft 里面建立很多很多的农场,总共 n 个,以至于他自己都忘记了每个 农场中种植作物的具体数量了,他只记得一些含糊的信息(共 m 个),以下列三种形式描 述: 农场 ...

  10. Filter防止用户访问一些未被授权的资源

    package com.drp.util.filter; import java.io.IOException; import javax.servlet.Filter; import javax.s ...