ABAP 7.53 中的ABAP SQL(原Open SQL)新特性
S/4 HANA 1809 已經(jīng)在上月發(fā)布,隨之而來的是ABAP 7.53。
本文是更新文檔中ABAP SQL的部分的翻譯。
本次更新的內(nèi)容較多,主要內(nèi)容包括:Open SQL更名為ABAP SQL;新函數(shù)和表達式;限制移除;table buffer增強;更嚴格的語法檢查規(guī)則等。
?
譯者水平有限,如有錯誤之處,請評論指出。
?
本文鏈接:https://www.cnblogs.com/hhelibeb/p/9848373.html
1,Open SQL的新名字:ABAP SQL
Open SQL已經(jīng)被更名為ABAP SQL。這個重命名反映出ABAP SQL的某些部分目前只支持特定的數(shù)據(jù)庫平臺(SAP HANA數(shù)據(jù)庫),已經(jīng)不再是全平臺獨立的了。
2,層次函數(shù)
層次函數(shù)(Hierarchy functions)是可以在查詢中被指定為數(shù)據(jù)源的表函數(shù)(table function)。
3,輔助連接
在一個以SAP HANA為主數(shù)據(jù)庫的ABAP應(yīng)用服務(wù)器上,表DBCON里的輔助連接也應(yīng)該是一個SAP HANA數(shù)據(jù)庫。除了CONNECTION附加項以外,它也對ABAP SQL和NATIVE SQL生效。(ADBC和EXCE SQL)。
不再需要使用Database Shared Libraries (DBSL),而應(yīng)使用SAP HANA Smart Data Access (SDA)。在SDA中,輔助數(shù)據(jù)庫使用特殊限定名或使用虛擬表從SAP HANA數(shù)據(jù)庫中尋址。如果將SAP HANA數(shù)據(jù)庫是ABAP服務(wù)器主數(shù)據(jù)庫,ABAP程序可以通過標準連接使用這些名字。只能通過AMDP或者Native SQL來使用這一功能。
4,關(guān)系表達式 IS INITIAL
可以在SQL條件中使用表達式 IS [NOT] INITIAL 來比較運算數(shù)和它們的類型初始值。
如果使用了該表達式,語法檢查會以7.53版本的嚴格模式運行。
(譯注:從文檔來看,7.53版本的嚴格模式規(guī)則和7.52版本是相同的。)
5,日期/時間函數(shù)
ABAP SQL現(xiàn)增加了對以下日期/時間函數(shù)的支持:
- 時間函數(shù)
- TIMS_IS_VALID
- 時間戳函數(shù)
- TSTMP_IS_VALID
- TSTMP_CURRENT_UTCTIMESTAMP
- TSTMP_SECONDS_BETWEEN
- TSTMP_ADD_SECONDS
- 日期/時間轉(zhuǎn)換
- TSTMP_TO_DATS
- TSTMP_TO_TIMS
- TSTMP_TO_DST
- 時區(qū)函數(shù)
- ABAP_USER_TIMEZONE
- ABAP_USER_TIMEZONE
?如果使用了這些函數(shù),語法檢查會以7.53版本的嚴格模式運行。
6,發(fā)布公用表表達式的Associations
可以通過公用表表達式(common table expression,以下簡稱CTE)訪問CDS視圖,現(xiàn)在可以使用語句WITH的WITH ASSOCIATIONS附加項來發(fā)布這些視圖的association,以便在當前WITH語句的路徑表達式中使用。附加項REDIRECT TO也可以用于替換前CTE或當前CTE發(fā)布的association的目標數(shù)據(jù)源。
如果使用了該附加項,語法檢查會以7.53版本的嚴格模式運行。
7,SELECT列表中的數(shù)字
此前,在SELECT查詢中只能使用INT4類型范圍內(nèi)的值。現(xiàn)在,可以使用長度為31的數(shù)字,當其不在INT4類型范圍內(nèi)時,會被解釋為DEC類型。
8,CAST增強
現(xiàn)在可以通過CAST表達式把INT1, INT2, INT3, INT4和INT8轉(zhuǎn)換為DEC了。
9,INSERT語句子查詢中的Client操作
現(xiàn)在,INSERT語句的附加項USING CLIENT可以在子查詢中指定了。這意味著在插入操作中指定的目標表的client可以不同于子查詢數(shù)據(jù)源的client。
如果沒有在子查詢中指定USING CLIENT,自動client操作會應(yīng)用當前的client ID。在7.53之前,使用USING CLIENT指定的client ID也會在子查詢中使用。
現(xiàn)在子查詢的FROM子句可以訪問使用INSERT語句填充的數(shù)據(jù)庫表或經(jīng)典視圖,這意味著可以從一個client復(fù)制數(shù)據(jù)到另一個client。
使用這一特性時,語法檢查會以7.53版本的嚴格模式運行。
10,以子查詢?yōu)閿?shù)據(jù)源的MODIFY
在ABAP SQL的寫語句MODIFY里,可以在FROM關(guān)鍵字后面使用一個加上括號的SELECT subquery_clauses來實現(xiàn)以子查詢作為數(shù)據(jù)源。子查詢的數(shù)據(jù)結(jié)果集的行,會直接在數(shù)據(jù)庫中插入或更新到目標表里。不再需要把數(shù)據(jù)從數(shù)據(jù)庫傳輸?shù)紸BAP應(yīng)用服務(wù)器了。
使用這一特性時,語法檢查會以7.53版本的嚴格模式運行。
11,USING CLIENT和會話變量client
如果在一個ABAP SQL讀語句中,存在對一個特定于客戶端的CDS視圖的多查詢,并且該CDS視圖中使用了annotation:@ClientHandling.algorithm:#SESSION_VARIABLE的話,多個查詢中的會話變量client(相當于SAP HANA數(shù)據(jù)庫中的ABAP特定會話變量CDS_CLIENT)必須設(shè)為同一值。如果為其中某項查詢設(shè)定了不同的值,則會發(fā)生運行時錯誤SAPSQL_DIFFERENT_CLIENT_VALUES。這種情況會在使用了WITH語句或者UNION語句時發(fā)生。
12,表緩存中的null值
現(xiàn)在表緩存支持真null值了,null值不再被轉(zhuǎn)換為類型初始值。在訪問緩存時,會產(chǎn)生和直接訪問數(shù)據(jù)庫時一樣的結(jié)果。不再存在相應(yīng)的限制。這會影響到以下方面:
- 對于包含null值的關(guān)系表達式,現(xiàn)在在緩存中進行比較的時候,結(jié)果也是unknown了(除非表達式是IS [NOT] INITIAL)。
- IS [NOT] NULL不再繞過緩存。
- 訪問被緩存的CDS視圖。當緩存被訪問時,會產(chǎn)生和直接訪問數(shù)據(jù)庫相同的結(jié)果。null值通常由outer join或某些表達式如case表達式產(chǎn)生。已經(jīng)不再存在只有不產(chǎn)生null值的CDS視圖才能被緩存的限制。
13,限制移除
- 對于某些SQL表達式和函數(shù),ABAP SQL的讀語句不再繞過緩存。
- 在不需要識別單行或者generic range的條件里,當某列指定在比較或者BETWEEN的右側(cè)時,ABAP SQL讀語句不再繞過緩存。前提是兩個運算數(shù)都是數(shù)字類型的、并且不是DF16_DEC類型或者DF34_DEC,或者都是字符類型的,或者都是都是RAW類型、且具有相同長度。
14,弱檢查
在ABAP SQL語句里使用了不被全部數(shù)據(jù)庫平臺支持的特性時,不會再產(chǎn)生語法檢查警告,而是產(chǎn)生擴展程序檢查警告。
15,新檢查
如果以內(nèi)表作為SELECT語句的數(shù)據(jù)源時,內(nèi)表需要被傳遞給數(shù)據(jù)庫表,會產(chǎn)生一個語法警告。可以使用pragma ##itab_db_select來隱藏這個語法檢查警告。
16,程序調(diào)用中的替換服務(wù)
類CL_OSQL_REPLACE中的方法ACTIVATE_REPLACEMENT有了新參數(shù)FLG_SURVIVE_SUBMIT,允許在被調(diào)用的程序中進行重定向。
17,GROUP BY附加項GROUPING SETS
在一個SELECT語句中,可以使用GROUP BY附加項GROUPING SETS了。附加項GROUPING SETS可以在一個SELECT語句下進行多個分組聚合。也可以在一個語句中通過對相同的SELECT使用不同的GROUP BY子句分組、并且使用UNION來實現(xiàn)相同的功能。后者易出錯并且對數(shù)據(jù)庫來說更難優(yōu)化。相比之下,GROUPING SETS附加項也使得解釋和維護SELECT語句變得更簡單。
18,聚合函數(shù)GROUPING
現(xiàn)在可以在SELECT語句中使用GROUPING函數(shù)。帶有聚合函數(shù)GROUPING的聚合表達式在GROUP BY子句中擔任分組集GROUPING SETS的分組函數(shù)。分組函數(shù)GROUPING可以區(qū)分出在結(jié)果集中的指定的列是否被聚合。只能在使用了包含GROUPING SETS附加項的GROUP BY子句的情況下使用該函數(shù)。
19,語法規(guī)則的更嚴格檢查
過去在語法檢查的嚴格模式的某些檢查規(guī)則,現(xiàn)在在非嚴格模式下也會有效。在非嚴格模式下,違反這些規(guī)則會產(chǎn)生語法檢查警告,在多數(shù)情況下,會導(dǎo)致程序運行期間產(chǎn)生運行時錯誤。
- 在訪問視圖時,鍵字段必須位于開始處。
- 在訪問關(guān)聯(lián)了CDS role的CDS entity時,不能使用附加項USING CLIENT和CLIENT SPECIFIED。
- 即使在使用路徑表達式時, 附加項CLIENT SPECIFIED也只能用于特定于客戶端的數(shù)據(jù)源。
- 指定列時,對于包含include結(jié)構(gòu)的數(shù)據(jù)庫表,必須使用組件的實際名稱,而不是ABAP Dictionary中定義的任何組的名稱。
- 使用關(guān)鍵字AS定義的SELECT列表的別名最多可包含30個字符。ORDER BY后也不允許使用超過30個字符的備用列名。
- LCHR和LRAW類型的列只有在與相應(yīng)長度字段一起讀取時才能在查詢中讀取。
- 對于SELECT中的FOR ALL ENTRIES:
- 當數(shù)據(jù)源的列與內(nèi)表列之間進行比較且它們的類型為p時,小數(shù)位必須匹配。
- 在ORDER BY之后使用PRIMARY KEY指定的主鍵的所有列也必須出現(xiàn)在SELECT列表中。
- 只能為具有基本行類型的內(nèi)表指定偽組件table_line。
- 對于聚合函數(shù)之外、在HAVING后指定的列,必須使用GROUP BY分組。這也適用于在使用了HAVING子句的時候直接在SELECT列表中指定、但沒有在GROUP BY后指定的列。
- 如果SELECT列表指定為*,HAVING子句只能同GROUP BY子句一起使用。
- 如果ORDER BY后使用了別名,這個名字必須是唯一的,也不可以和沒有別名的列的名字相同。
- 在into后指定的工作區(qū)wa的字段少于SELECT列表中的顯式字段。
- 在SELECT列表中顯式指定的字段無法被賦給into子句中相應(yīng)的結(jié)構(gòu)工作區(qū)wa里的字段,或者無法賦給由括號包圍、逗號分隔的數(shù)據(jù)對象。
- 在LIKE的右側(cè),不能指定長度是左側(cè)字段2倍以上的字符文本或常量。
- 使用UPDATE FROM或MODIFY FROM訪問所有字段都是鍵字段的投影視圖。
- 使用INSERT FROM, UPDATE FROM,或者MODIFY FROM創(chuàng)建寫入流時指定于通用的引用(A reference that is too general)。
- 在語句UPDATE中,列只能出現(xiàn)在單個更新表達式(update expression)的左端。
英文原文:ABAP SQL in Release 7.53
可以參考《數(shù)據(jù)庫系統(tǒng)概念》的第3章SQL、第4章中級SQL和第5章高級SQL以理解某些內(nèi)容。
?
相關(guān)閱讀:ABAP 7.52 中的Open SQL新特性
?? ABAP 7.50 新特性
??? ABAP 7.40, SP08 中的 Open SQL 新特性
?
轉(zhuǎn)載于:https://www.cnblogs.com/hhelibeb/p/9848373.html
總結(jié)
以上是生活随笔為你收集整理的ABAP 7.53 中的ABAP SQL(原Open SQL)新特性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java(21)_ ^、|、运算符
- 下一篇: C++对拍程序