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)新特性


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM