1. 程式人生 > >ABAP 7.53 中的ABAP SQL(原Open SQL)新特性

ABAP 7.53 中的ABAP SQL(原Open SQL)新特性

S/4 HANA 1809 已經在上月釋出,隨之而來的是ABAP 7.53。

本次更新的內容較多,主要內容包括:Open SQL更名為ABAP SQL;新函式和表示式;限制移除;table buffer增強;更嚴格的語法檢查規則等。

本文是更新文件中ABAP SQL的部分的翻譯。

譯者水平有限,如有錯誤之處,請評論指出。

1,Open SQL的新名字:ABAP SQL

Open SQL已經被更名為ABAP SQL。這個重新命名反映出ABAP SQL的某些部分目前只支援特定的資料庫平臺(SAP HANA資料庫),已經不再是全平臺獨立的了。

2,層次函式

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現增加了對以下日期/時間函式的支援:

  • 時間戳函式
    • TSTMP_IS_VALID
    • TSTMP_CURRENT_UTCTIMESTAMP
    • TSTMP_SECONDS_BETWEEN
    • TSTMP_ADD_SECONDS

 如果使用了這些函式,語法檢查會以7.53版本的嚴格模式執行。

6,釋出公用表表達式的Associations

可以通過公用表表達式(common table expression,以下簡稱CTE)訪問CDS檢視,現在可以使用語句WITH的WITH ASSOCIATIONS附加項來發布這些檢視的association,以便在當前WITH語句的路徑表示式中使用。附加項REDIRECT TO也可以用於替換前CTE或當前CTE釋出的association的目標資料來源。

如果使用了該附加項,語法檢查會以7.53版本的嚴格模式執行。

7,SELECT列表中的數字

此前,在SELECT查詢中只能使用INT4類型範圍內的值。現在,可以使用長度為31的數字,當其不在INT4類型範圍內時,會被解釋為DEC型別。

8,CAST增強

現在可以通過CAST表示式把INT1, INT2, INT3, INT4和INT8轉換為DEC了。

9,INSERT語句子查詢中的Client操作

現在,INSERT語句的附加項可以在子查詢中指定了。這意味著在插入操作中指定的目標表的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)。
  • 訪問被快取的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,程式呼叫中的替換服務

17,GROUP BY附加項GROUPING SETS

在一個SELECT語句中,可以使用GROUP BY附加項GROUPING SETS了。附加項GROUPING SETS可以在一個SELECT語句下進行多個分組聚合。也可以在一個語句中通過對相同的SELECT使用不同的GROUP BY子句分組、並且使用UNION來實現相同的功能。後者易出錯並且對資料庫來說更難優化。相比之下,GROUPING SETS附加項也使得解釋和維護SELECT語句變得更簡單。

18,聚合函式GROUPING

現在可以在SELECT語句中使用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)。

可以參考《資料庫系統概念》的第3章SQL、第4章中級SQL和第5章高階SQL以理解某些內容。