如果结果集包含多行,可以在 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 不影响配置在配置文件参数中,用于在数据库服务器和应用服务器之间传输数据的包的大小。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。