S/4 HANA 1809 已经在上月发布,随之而来的是ABAP 7.53。
本文是更新文档中ABAP SQL的部分的翻译。
本次更新的内容较多,主要内容包括:Open SQL更名为ABAP SQL;新函数和表达式;限制移除;table buffer增强;更严格的语法检查规则等。
译者水平有限,如有错误之处,请评论指出。
本文链接: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版本的严格模式运行。
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语句的附加项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语句变得更简单。
18,聚合函数GROUPING
现在可以在SELECT语句中使用GROUPING函数。带有聚合函数GROUPING的聚合表达式在GROUP BY子句中担任分组集GROUPING SETS的分组函数。分组函数GROUPING可以区分出在结果集中的指定的列是否被聚合。只能在使用了包含GROUPING SETS附加项的GROUP BY子句的情况下使用该函数。
19,语法规则的更严格检查
过去在语法检查的严格模式的某些检查规则,现在在非严格模式下也会有效。在非严格模式下,违反这些规则会产生语法检查警告,在多数情况下,会导致程序运行期间产生运行时错误。
- 在访问视图时,键字段必须位于开始处。
- 在访问关联了CDS role的CDS entity时,不能使用附加项USING CLIENT和CLIENT SPECIFIED。
- 即使在使用路径表达式时, 附加项CLIENT SPECIFIED也只能用于特定于客户端的数据源。
- 指定列时,对于包含include结构的数据库表,必须使用组件的实际名称,而不是ABAP Dictionary中定义的任何组的名称。
- 使用关键字AS定义的SELECT列表的别名最多可包含30个字符。ORDER BY后也不允许使用超过30个字符的备用列名。
- LCHR和LRAW类型的列只有在与相应长度字段一起读取时才能在查询中读取。
- 对于SELECT中的FOR ALL ENTRIES:
- 当数据源的列与内表列之间进行比较且它们的类型为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)的左端。
可以参考《数据库系统概念》的第3章SQL、第4章中级SQL和第5章高级SQL以理解某些内容。
ABAP 7.40, SP08 中的 Open SQL 新特性