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,轉換函數
新的類型轉換函數BINTOHEX和HEXTOBIN現在可以在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 CLIENT和CLIENT SPECIFIED會應用以下(更嚴格的)規則:
- CDS訪問控制不會在跨Client訪問時工作。因此,附加項USING CLIENT和CLIENT 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 新特性