ABAP 7.53 中的ABAP SQL(原Open SQL)新特性
S/4 HANA 1809 已經在上月釋出,隨之而來的是ABAP 7.53。
本次更新的內容較多,主要內容包括:Open SQL更名為ABAP SQL;新函式和表示式;限制移除;table buffer增強;更嚴格的語法檢查規則等。
本文是更新文件中ABAP SQL的部分的翻譯。
譯者水平有限,如有錯誤之處,請評論指出。
本文連結:ofollow,noindex">https://www.cnblogs.com/hhelibeb/p/9848373.html
1,Open SQL的新名字:ABAP SQL
Open SQL已經被更名為ABAP SQL 。這個重新命名反映出ABAP SQL的某些部分目前只支援特定的資料庫平臺(SAP HANA資料庫),已經不再是全平臺獨立的了。
2,層次函式
層次函式(Hierarchy functions) 是可以在查詢中被指定為資料來源的表函式(table function )。
3,輔助連線
在一個以SAP HANA為主資料庫的ABAP應用伺服器上,表DBCON裡的輔助連線也應該是一個SAP HANA資料庫。除了CONNECTION附加項以外,它也對ABAP SQL和NATIVE SQL生效。(ADBC和EXCE SQL)。
不再需要使用Database Shared Libraries (DBSL),而應使用SAP HANA Smart Data Access (SDA)。在SDA中,輔助資料庫使用特殊限定名或使用虛擬表從SAP HANA資料庫中定址。如果將SAP HANA資料庫是ABAP伺服器主資料庫,ABAP程式可以通過標準連線使用這些名字。只能通過AMDP或者Native SQL來使用這一功能。
4,關係表示式 IS INITIAL
可以在SQL條件中使用表示式IS [NOT] INITIAL 來比較運算數和它們的型別初始值。
如果使用了該表示式,語法檢查會以7.53版本的嚴格模式執行。
(譯註:從文件 來看,7.53版本的嚴格模式規則和7.52版本是相同的。)
5,日期/時間函式
ABAP SQL現增加了對以下日期/時間函式的支援:
-
時間函式
- TIMS_IS_VALID
-
時間戳函式
- TSTMP_IS_VALID
- TSTMP_CURRENT_UTCTIMESTAMP
- TSTMP_SECONDS_BETWEEN
- TSTMP_ADD_SECONDS
-
日期/時間轉換
- TSTMP_TO_DATS
- TSTMP_TO_TIMS
- TSTMP_TO_DST
-
時區函式
- ABAP_USER_TIMEZONE
- ABAP_USER_TIMEZONE
如果使用了這些函式,語法檢查會以7.53版本的嚴格模式執行。
可以通過公用表表達式(common table expression,以下簡稱CTE) 訪問CDS檢視, 現在可以使用語句WITH的WITH ASSOCIATIONS 附加項來發布這些檢視的association,以便在當前WITH語句的路徑表示式中使用。附加項REDIRECT TO 也可以用於替換前CTE或當前CTE釋出的association的目標資料來源。
如果使用了該附加項,語法檢查會以7.53版本的嚴格模式執行。
此前,在SELECT查詢中只能使用INT4類型範圍內的值。現在,可以使用長度為31的數字,當其不在INT4類型範圍內時,會被解釋為DEC型別。
現在可以通過CAST表示式 把INT1, INT2, INT3, INT4和INT8轉換為DEC了。
9,INSERT語句子查詢中的Client操作
現在,INSERT語句的附加項 USING CLIENT 可以在子查詢中指定了。這意味著在插入操作中指定的目標表的client可以不同於子查詢資料來源的client。
如果沒有在子查詢中指定USING CLIENT,自動client操作會應用當前的client ID。在7.53之前,使用USING CLIENT指定的client ID也會在子查詢中使用。
現在子查詢的FROM子句可以訪問使用INSERT語句填充的資料庫表或經典檢視,這意味著可以從一個client複製資料到另一個client。
使用這一特性時,語法檢查會以7.53版本的嚴格模式執行。
10,以子查詢為資料來源的MODIFY
在ABAP SQL的寫語句MODIFY裡,可以在FROM關鍵字後面使用一個加上括號的 SELECT subquery_clauses 來實現以子查詢作為資料來源。子查詢的資料結果集的行,會直接 在資料庫中插入或更新到目標表裡。不再需要把資料從資料庫傳輸到ABAP應用伺服器了。
使用這一特性時,語法檢查會以7.53版本的嚴格模式執行。
11,USING CLIENT和會話變數client
如果在一個ABAP SQL讀語句中,存在對一個特定於客戶端的CDS檢視的多查詢,並且該CDS檢視中使用了annotation:@ClientHandling.algorithm:#SESSION_VARIABLE 的話,多個查詢中的會話變數 client(相當於SAP HANA資料庫中的ABAP特定會話變數CDS_CLIENT )必須設為同一值。如果為其中某項查詢設定了不同的值,則會發生執行時錯誤SAPSQL_DIFFERENT_CLIENT_VALUES 。這種情況會在使用了WITH語句 或者UNION語句時發生。
12,表快取中的null值
現在表快取 支援真null值 了,null值不再被轉換為型別初始值。在訪問快取時,會產生和直接訪問資料庫時一樣的結果。不再存在相應的限制。這會影響到以下方面:
- 對於包含null值的關係表示式,現在在快取中進行比較的時候,結果也是unknown了(除非表示式是IS [NOT] INITIAL )。
- IS [NOT] NULL 不再繞過快取。
- 訪問被快取的CDS檢視 。當快取被訪問時,會產生和直接訪問資料庫相同的結果。null值通常由outer join或某些表示式如case表示式產生。已經不再存在只有不產生null值的CDS檢視才能被快取的限制。
13,限制移除
- 對於某些SQL表示式和函式 ,ABAP SQL的讀語句不再繞過快取。
- 在不需要識別單行或者generic range的條件裡,當某列指定在比較 或者BETWEEN 的右側時,ABAP SQL讀語句不再繞過快取。前提是兩個運算數都是數字型別的、並且不是DF16_DEC型別或者DF34_DEC,或者都是字元型別的,或者都是都是RAW型別、且具有相同長度。
14,弱檢查
在ABAP SQL語句裡使用了不被全部資料庫平臺支援的特性時,不會再產生語法檢查警告,而是產生擴充套件程式檢查 警告。
15,新檢查
如果以內表作為SELECT語句的資料來源時,內表需要被傳遞給資料庫表,會產生一個語法警告。可以使用pragma##itab_db_select來隱藏這個語法檢查警告。
16,程式呼叫中的替換服務
類CL_OSQL_REPLACE中 的方法ACTIVATE_REPLACEMENT 有了新引數FLG_SURVIVE_SUBMIT,允許在被呼叫的程式中進行重定向。
17, GROUP BY附加項GROUPING SETS
在一個SELECT語句中,可以使用GROUP BY附加項GROUPING SETS了。附加項GROUPING SETS可以在一個SELECT語句下進行多個分組聚合。也可以在一個語句中通過對相同的SELECT使用不同的GROUP BY子句分組、並且使用UNION來實現相同的功能。後者易出錯並且對資料庫來說更難優化。相比之下,GROUPING SETS附加項也使得解釋和維護SELECT語句變得更簡單。
現在可以在SELECT語句中使用ping_function.htm" target="_blank" rel="nofollow,noindex">GROUPING
函式。帶有聚合函式GROUPING的聚合表示式在GROUP BY子句中擔任分組集GROUPING SETS的分組函式。分組函式GROUPING可以區分出在結果集中的指定的列是否被聚合。只能在使用了包含GROUPING SETS附加項的GROUP BY子句的情況下使用該函式。
19,語法規則的更嚴格檢查
過去在語法檢查的嚴格模式的某些檢查規則,現在在非嚴格模式下也會有效。在非嚴格模式下,違反這些規則會產生語法檢查警告,在多數情況下,會導致程式執行期間產生執行時錯誤。
- 在訪問檢視時,鍵欄位必須位於開始處。
- 即使在使用路徑表示式時, 附加項CLIENT SPECIFIED 也只能用於特定於客戶端的資料來源。
- 指定列時,對於包含include結構的資料庫表,必須使用元件的實際名稱 ,而不是ABAP Dictionary中定義的任何組的名稱。
- 使用關鍵字AS定義的SELECT列表的別名最多可包含30個字元。 ORDER BY後也不允許使用超過30個字元的備用列名。
- LCHR和LRAW型別的列只有在與相應長度欄位一起讀取時才能在查詢中讀取。
-
- 當資料來源的列與內表列之間進行比較且它們的型別為p時,小數位必須匹配。
- 在ORDER BY之後 使用PRIMARY KEY 指定的主鍵的所有列也必須出現在SELECT列表中。
- 只能為具有基本行型別的內表指定偽元件table_line。
- 對於聚合函式之外、在HAVING後指定的列,必須使用GROUP BY分組。這也適用於在使用了HAVING子句的時候直接在SELECT列表中指定、但沒有在GROUP BY後指定的列。
- 如果SELECT列表指定為*,HAVING子句只能同GROUP BY子句一起使用。
- 如果ORDER BY後使用了別名 ,這個名字必須是唯一的,也不可以和沒有別名的列的名字相同。
- 在into後指定的工作區wa的欄位少於SELECT列表中的顯式欄位。
- 在SELECT列表中顯式指定的欄位無法被賦給 into子句中相應的結構工作區wa裡的欄位,或者無法賦給由括號包圍、逗號分隔的資料物件。
- 在LIKE的右側,不能指定長度是左側欄位2倍以上的字元文字或常量。
- 使用UPDATE FROM或MODIFY FROM訪問所有欄位都是鍵欄位的投影檢視 。
- 使用INSERT FROM, UPDATE FROM,或者MODIFY FROM建立寫入流時指定於通用的引用(A reference that is too general)。
- 在語句UPDATE中,列只能出現在單個更新表示式(update expression) 的左端。
英文原文: ABAP SQL in Release 7.53
可以參考《資料庫系統概念 》的第3章SQL、第4章中級SQL和第5章高階SQL以理解某些內容。