天天看點

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

繼續閱讀