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

举报
汪子熙 发表于 2024/05/05 20:04:13 2024/05/05
【摘要】 如果结果集包含多行,可以在 INTO 或 APPENDING 后使用转义字符 @ 指定任何表类型的内部表 itab 作为宿主变量。内部表的行类型必须满足先决条件。根据 INSERT 的规则,结果集逐行插入到内部表 itab 中;如果是已排序的表,则执行排序过程。如果使用 INTO,则会初始化内部表。如果使用 APPENDING,则之前的行保持不变。如果与现有的唯一表键冲突,会引发一个无法处理...

如果结果集包含多行,可以在 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 不影响配置在配置文件参数中,用于在数据库服务器和应用服务器之间传输数据的包的大小。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。