关于 ABAP OPEN SQL SELECT 语句的一些额外说明

简介: 关于 ABAP OPEN SQL SELECT 语句的一些额外说明

如果结果集包含多行,可以在 INTO 或 APPENDING 后使用转义字符 @ 指定任何表类型的内部表 itab 作为宿主变量。内部表的行类型必须满足先决条件。

根据 INSERT 的规则,结果集逐行插入到内部表 itab 中;如果是已排序的表,则执行排序过程。如果使用 INTO,则会初始化内部表。如果使用 APPENDING,则之前的行保持不变。如果与现有的唯一表键冲突,会引发一个无法处理的异常,就像在 INSERT LINES OF 的情况一样。


在将结果集的一行分配给内部表 itab 的初始行之前,会创建一个内部表的初始行,并将结果集的一行分配给这一行。


在将结果集的一行分配给内部表的一行时,无论是否使用 CORRESPONDING FIELDS,适用的规则与分配给个别工作区域 wa 时的规则相同(参见上文),但插入到内部表时的例外是,LOB 句柄可以作为定位器创建,而不是作为读取流。


如果没有使用附加的 PACKAGE SIZE,结果集的所有行都将插入到内部表 itab 中,且在 SELECT 后不得指定 ENDSELECT。


如果结果集为空,当使用 INTO 时,将初始化内部表;使用 APPENDING 时,内部表保持不变。


当指定具有唯一主键或次键的内部表时,如果尝试创建重复条目,将引发无法处理的异常。


如果在使用 CORRESPONDING FIELDS 时,内部表包含更多不必要的列,通常会由初始字段占用过多内存,并且语法检查会显示警告。在需要列的情况下,例如程序用派生值填充这些列时,可以使用 pragma 绕过警告。


由于一个 Open SQL 语句能够分配的数据流的最大数量限制为16,因此创建读取流来导入内部表没有任何意义。


附加说明


… PACKAGE SIZE n


效果


如果指定了 PACKAGE SIZE,那么对于 SELECT 的结果集,所有行将在循环中处理,并且这个循环必须以 ENDSELECT 结束。这些行以 n 行的包插入到内部表 itab 中。n 需要是一个宿主变量、宿主表达式或类型为 i 的字面量(包含行数)。n 的内容必须符合无损分配的数据类型 i 的规则。如果 n 的值小于 0,将引发无法处理的异常。如果 n 等于 0,则结果集的所有行都将插入内部表 itab。如果在 FETCH 语句中使用,则从当前游标位置提取 n 行。


如果使用 INTO,每次插入前都会初始化内部表,并且在 SELECT 循环中它只包含当前包的行。如果使用 APPENDING,则每个 SELECT 循环或每次使用 FETCH 提取时,将进一步的包添加到内部表的现有行中。


如果使用 INTO,ENDSELECT 后 itab 的内容未定义。即表可能包含最后一个包的行,也可能是初始化状态。如果使用 APPENDING,则 itab 的内容保留最后一个循环的状态。


注意


附加的 PACKAGE SIZE 可以在 INTO 之后使用,以限制一次性读入的数据量。否则,在将过大的数据集读入内部表时,可能会发生运行时错误,因为超出了其最大大小。在 APPENDING 后,PACKAGE SIZE 不能防止此种运行时错误。


如果与 FOR ALL ENTRIES 一起指定了 PACKAGE SIZE,则所有选定的行最初都读入一个内部系统表,包只在从系统表传递到实际目标表时创建。


PACKAGE SIZE 不影响配置在配置文件参数中,用于在数据库服务器和应用服务器之间传输数据的包的大小。

相关文章
|
1月前
|
SQL 数据挖掘 大数据
如何在 SQL Server 中使用 `SELECT TOP`
【8月更文挑战第10天】
76 7
如何在 SQL Server 中使用 `SELECT TOP`
|
21天前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
26 1
|
1月前
|
SQL 关系型数据库 MySQL
INSERT INTO t_a.tableName SELECT * FROM t_b.tableName 如何通过定义一个list对象,包含多个tableName,循环执行前面的sql,用MySQL的语法写
【8月更文挑战第7天】INSERT INTO t_a.tableName SELECT * FROM t_b.tableName 如何通过定义一个list对象,包含多个tableName,循环执行前面的sql,用MySQL的语法写
24 5
|
21天前
|
SQL 数据挖掘 关系型数据库
|
26天前
|
SQL
访问者模式问题之构造一个包含 select、from 和 where 子句的 SQL 节点树,如何解决
访问者模式问题之构造一个包含 select、from 和 where 子句的 SQL 节点树,如何解决
|
2月前
|
SQL Oracle 关系型数据库
SQL SELECT TOP 子句
【7月更文挑战第12天】SQL SELECT TOP 子句。
36 14
|
2月前
|
SQL Oracle 关系型数据库
SQL SELECT TOP 子句
【7月更文挑战第13天】SQL SELECT TOP 子句。
23 5
|
2月前
|
SQL 存储 数据库
SQL SELECT 语句
【7月更文挑战第10天】SQL SELECT 语句。
31 9
|
2月前
|
SQL 数据库
SQL SELECT DISTINCT 语句
【7月更文挑战第10天】SQL SELECT DISTINCT 语句。
36 6
|
2月前
|
SQL 数据处理 数据库
SQL SELECT语句的高级应用与技巧
SQL SELECT语句的高级应用与技巧