如何读取并处理数据库表_第1页
如何读取并处理数据库表_第2页
如何读取并处理数据库表_第3页
如何读取并处理数据库表_第4页
如何读取并处理数据库表_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1读取并处理 数据库表概览内容数据库表和 SQL 概念从数据库表 读取数据定义选择的 结果指 定将读取的 数据库表为选定数据 指定目标区选择即将读 取的行给行分组指定行的顺 序更改数据库 表的内容向数据库表 添加行在数据库表 中更改行添加或更改 行从数据库表 中删除行使用光标从 数据库表中 读取行打开光标用光标读取 数据如果 FETCH 语句没有读 取任何行, SY-SUBRC 就设置为 4,否则设 置为 0。关闭光标使用光标读 取数据的示 例确认或取消 对数据库表 的更改为数据库表 处理指定集 团在 ABAP/4 程序中使用 本地的SQL 语句在 ABAP/4 程序的执行 过程中锁定 数据库对象检查 ABAP/4 程序用户的 权限本节讲述下 列主题:ABAP/4 中的 SQL 概念ABAP/4 的开放式 SQLABAP/4 自身的 SQL锁定和授权在处理来自 数据库表的 大量数据时 ,程序的运 行时间就成 了影响性能 的重要因素 。有关如何 达到最优性 能的示例, 请选择 ABAP/4 开发工作台 中的“测试 实时分析” (或使用事 务 SE30) ,并选定“ 提示和策略 ”。在“SQL 界面”下, 将可找到关 于本节的适 当示例。2数据库表和 SQL 概念在 R/3 系统中,需 长期保存的 数据都存储 在关系数据 库表中。关 于各种类型 的数据库表 以及如何创 建和维护它 们的信息, 参见文档 ABAP/4 词典 (页 Error! Not a valid link.) 。结构化查询 语言 (SQL) 是为访问关 系数据库创 建的。SQL 有两个语句 类型:数据 定义语言 (DDL) 语句和数据 操作语言 (DML) 语句。现在,SQL 还没有完全 标准化。要 访问指定的 数据库系统 ,必须查阅 该系统的文 档,以获取 可用的 SQL 语句及其正 确的语法的 列表。要在 ABAP/4 程序中包含 这些 SQL 语句,请使 用自身的 SQL(参 见 在 ABAP/4 程序中使用 本地的SQL 语句 (页 ) )。为了避免不 同的数据库 表之间的不 兼容性,并 使 ABAP/4 程序能在应 用中独立于 数据库系统 ,SAP 创建了一套 叫作开放式 SQL 的独立 SQL 语句。开放 式 SQL 包含了一套 标准的 SQL 语句以及一 些专用于 SAP 的增强语句 。使用开放 式 SQL,可 以访问对 SAP 系统有效的 任何数据库 表,而不用 考虑它的创 建者。下图显示了 开放式 SQL 与自身的 SQL 之间的区别 :数据库界面 可将 SAP 的开放式 SQL 语句翻译成 专用于现正 使用的数据 库的 SQL 命令。自身 的 SQL 直接访问数 据库。开放式 SQL 关键字关键字用途SELECT从数据库表 读取数据 (页 ) INSERT向数据库表 添加行 (页 ) UPDATE在数据库表 中更改行 (页 ) MODIFY添加或更改 行 (页 ) DELETE从数据库表 中删除行 (页 ) OPEN CURSOR,FETCH, CLOSE CURSOR使用光标从 数据库表中 读取行 (页 ) COMMIT WORK, ROLLBACK WORK确认或取消 对数据库表 的更改 (页 ) 在 ABAP/4 程序中使用 开放式 SQL 语句时,必 须保证:1) 被定址的数 据库系统必 须是 SAP 支持的。2) 必须已经在 ABAP/4 词典中定义 了被定址的 数据库表。下列系统字 段在开放式 SQL 操作中起着 重要的作用 :_ SY-SUBRC和使用其它 ABAP/4 语句一样, 系统字段 SY-SUBRC 中的返回代 码值表示在 每个开放式 SQL 操作之后该 操作是否成 功。如果操 作是成功的 ,SY-SUBRC 的值就等于 0;如果操 作是失败的 ,SY-SUBRC 的值就不等 于 0。_ SY-DBCNTSY-DBCNT 字段中的值 表明受该操 作影响的行 数,或已被 处理的行数 。可以使用 SQL 跟踪实用 程序监视 SQL 或 ABAP/4 功能的性能 。为此,请 选择“系统 实用程序SQL跟 踪”。详细 信息,参见 文档 ABAP/4 工作台工具 (页 Error! Not a valid link.) 。3从数据库表 读取数据要从数据库 表读取数据 ,请使用 SELECT 语句。语法SELECT FROM INTO WHERE GROUP BY ORDER BY .该语句有几 个基本子句 。下表中列 出了每一个 子句。子句说明SELECT SELECT 子句定义选 择的结果是 单行还是一 个表、选择 的是哪些列 、以及是否 将排除相同 的行。定义选择的 结果 (页 ) FROM FROM 子句指定即 将从中选取 数据的数据 库表或视图 。指 定将读取的 数据库表 (页 ) INTO INTO 子句确定即 将读入选定 数据的目标 区 。 该子句也可 以放在FROM 子句之前。 如果没有指 定 INTO 子句,系统 将使用表工 作区。表工 作区是由 TANLES 语句自动创 建的表头行 。为选定数据 指定目标区 (页 ) WHERE WHERE 子句指定将 按照指定的 条件读取哪 些行来作为 选择。选择即将读 取的行 (页 ) GROUP BY GROUP-BY 子句从几行 组成的组中 产生了作为 结果的单行 。一个组是 在 中列出的列 中有相同值 的行的集合 。给行分组 (页 ) ORDER BY ORDER-BY 子句为选定 的行定义顺 序 。指定行的顺 序 (页 ) 关于 SELECT 语句及其子 句性能的重 要信息,参 见关键字文 档。3定义选择的 结果SELECT 子句定义是 选择单行还 是选择多行 、是否去掉 重复行以及 将选择哪些 列。图中显示了 可能的选择 :有关叙述 SELECT 子句的三个 变式的主题 ,参见4选择多行中 的所有数据要从数据库 表中读取所 有列和多行 ,请按如下 方式在循环 中使用 SELECT 语句。语法SELECT DISTINCT * . .ENDSELECT.必须用 ENDSELECT 语句结束该 循环。该循环依次 读取所选行 ,并为每个 读取的行执 行循环中的 ABAP/4 语句。SELECT 循环的结果 是与被读取 的数据库表 的格式完全 相同的表。DISTINCT 选项将自动 的去掉重复 的行。如果至少读 取了一行, 系统字段 SY-SUBRC 就返回 0。如果没 有读取,系 统字段 SY-SUBRC 就返回 4。系统字 段 SY-DBCNT 给读取的行 计数。每执 行一次 SELECT 语句,SY-DBCNT 都加 1。TABLES SPFLI.SELECT * FROM SPFLI WHERE CITYFROM EQ FRANKFURT. . WRITE: / SPFLI-CARRID, SPFLI-CONNID, SPFLI-CITYFROM, SPFLI-CITYTO. .ENDSELECT.该 SELECT 循环从 SPFLI-CITYFROM 字段中包含 “FRANKFURT” 的 SPFLI 表中读取所 有的行(由 WHERE 子句指定) 。读取的每 一行的数据 都由循环中 的 WRITE 语句写入输 出列表中。输出列表如 下所示:4选择单行中 的所有数据要从数据库 表中读取单 个行的所有 列,请按如 下方式使用 SELECT 语句:语法SELECT SINGLE FOR UPDATE * . WHERE .该语句的结 果是一个单 行。为了保 证清楚地指 定了一行, 就必须在 WHERE 子句的条件 中用 AND 链接形成数 据库表主码 主码的所有 字段。(关 于 WHERE 子句的信息 ,参见 选择即将读 取的行 (页 ) )。如果系统没 有找到具有 指定关键字 的行,系统 字段 SY-SUBRC 将设置为 4。如果系 统找到了一 个完全符合 指定条件的 行,SY-SUBRC 就返回 0。可以使用 FOR UPDATE 选项锁定在 数据库表中 选定的行。 程序将一直 等到接收到 该锁定。如 果数据库检 测到或怀疑 有一个死锁 定,将产生 运行时间错 误。FOR UPDATE 选项不是将 SAP 锁定机制与 ENQUEUE/DEQUEUE 功能模块一 起使用的替 代品。例如 ,显示一个 新的屏幕时 ,所有用 FOR UPDATE 锁定的行都 将自动解锁 。要保证在 显示新屏幕 时锁定的行 保留锁定状 态,就必须 使用 SAP 锁定机制。 这是使锁定 的行一直到 事务的结束 都保留其锁 定状态的唯 一方法。详 细信息,参 见 在 ABAP/4 程序的执行 过程中锁定 数据库对象 (页 ) TABLES SPFLI.SELECT SINGLE * FROM SPFLI WHERE CARRID EQ LH AND CONNID EQ 2407.WRITE: / SPFLI-CARRID, SPFLI-CONNID, SPFLI-CITYFROM, SPFLI-CITYTO.该 SELECT 语句只从 SPFLI 中读取 CARRID 字段中包含 “LH”并 且 CONNID 字段中包含 “2407” 的行。输出屏幕如 下所示5选择并处理 指定列中数 据要读取显式 地包含规定 的列的行, 或要得到关 于数据库表 特定列的摘 要信息,请 按如下方法 一起使用 SELECT 语句与列表 :语法SELECT SINGLE FOR UPDATE DISTINCT .其中每个 都具有下列 形式之一_ 是数据库表 的字段或表 单的总计表 达式:( DISTINCT )关于总计表 达式的说明 ,参见下列 内容。_ AS 是结构化目 标区的第 i 个组件的可 选名称。可 使用该可选 名称将读取 或处理指定 行的结果写 到目标区的 组件 中。为此, 还必须使用 INTO 子句的 CORRESPONDING FIELDS 选项(关于 该选项的详 细信息及示 例,参见 逐个组件地 读取数据 (页 ) )。DISTINCT 选项将自动 地去掉重复 行。如果指定了 SINGLE 选项,选择 的结果将由 一单行的列 . 组成。将如 选择单行中 的所有数据 (页 ) 中的描述选 择该行。可按如下方 法书写 SELECT 语句以在运 行时指定列 :语法SELECT SINGLE FOR UPDATE DISTINCT ().如果内表 包含列表 ., 该语句的操 作与上述情 况一样。因 此,内表 的行类型必 须是最大长 度为 72,类型 为 C 的字段。如 果内表为空 ,那么,该 语句就按照 指定的是星 号(*)而 不是 来进行操作 。总计表达式使用总计表 达式,可从 数据库表的 列 中摘录特征 数据。有效 的总计表达 式是:_ MAX: 返回列 的最大值_ MIN: 返回列 的最小值_ AVG: 返回列 的平均值_ SUM: 返回列 的总计_ COUNT: 按下列方式 给值或行计 数:-COUNT( DISTINCT ) 返回列 的不同值的 个数。-COUNT( * ) 返回选定行 的总数。在括号和参 数之间必须 包含空格。 算术操作符 AVG 和 SUM 只能对数字 字段进行操 作。SELECT 子句和 INTO 子句中的列 表如果在 SELECT 子句中有一 个列表,就 必须将 INTO 子句与 SELECT 语句一起使 用。和相关 主题中叙述 的一样,可 以将工作区 或内表 用作参数。 注意,如果 SELECT 子句包含了 一个列表, 那么就根据 工作区 或内表 的结构将选 择的数据从 左至右输出 到目标区中 。这是一个 例外。通常 情况下,选 择的数据是 根据表工作 区的结构从 左至右输出 到目标区中 ,而不考虑 目标区的结 构(关于 INTO 子句的详细 信息,参见 为选定数据 指定目标区 (页 ) )。SELECT 子句中有一 个列表时, 可在 INTO 子句中将列 表 , , . 用作参数:SELECT . INTO (, , .).SELECT 子句和 INTO 子句中的列 表必须包含 相同数目的 元素。如果 可能,在传 输数据过程 中,应将值 转换成目标 字段的数据 类型(数据 库表和 ABAP/4 数据类型之 间可转换性 的信息,参 见有关 INTO 子句的关键 字文档)。 如果在 SELECT 子句的列表 中除总计表 达式以外还 有一个或多 个数据库字 段,就必须 在 GROUP-BY 子句中列出 所有数据库 字段(详细 信息,参见 给行分组 (页 ) )。TABLES SPFLI.DATA: LIST(72) OCCURS 1, LINE(72).LINE = CITYFROM CITYTO .APPEND LINE TO LIST.SELECT DISTINCT (LIST) INTO CORRESPONDING FIELDS OF SPFLI FROM SPFLI. WRITE: / SPFLI-CITYFROM, SPFLI-CITYTO.ENDSELECT.在该示例中 ,将列 CITYFROM 和 CITYTO 写到内表 LIST 中,并且只 从 SPFLI 中选择这些 列。选择结 果将写到表 工作区 SPFLI 中。关于 INTO 子句的 CORRESPONDING FIELDS 选项的信息 ,参见 逐个组件地 读取数据 (页 ) 。因为使用 了 DISRINCT 选项,所以 将去掉重复 的行。假设下列数 据库表 TEST 由 10 行组成:COL_1COL_2132135475263718994103要摘录并处 理列数据, 可使用下列 程序:TABLES TEST.DATA RESULT TYPE P DECIMALS 2.SELECT ( DISTINCT COL_2 ) INTO RESULT FROM TEST.WRITE RESULT.下表显示了 根据总计表 达式 和 DISTINCT 选项的不同 组合所得到 的该程序的 结果。使用的总计 表达式包含 的DISTINCT选项结果MAXno9.00MAXyes9.00MINno1.00MINyes1.00AVGno3.80AVGyes4.43SUMno38.00SUMyes31.00COUNTyes7.00COUNT( * )-10.007指 定将读取的 数据库表要指定将用 SELECT 语句读取的 数据库表或 视图,可使 用 FROM 子句。参见7在程序中指 定数据库表 名要在程序中 指定即将读 取的数据库 表或视图, 请按下列格 式使用 FROM 子句:语法. FROM CLIENT SPECIFIED BYPASSING BUFFER UP TO ROWS.数据库表或 视图 必须对 ABAP/4 词典有效, 并且必须在 ABAP/4 程序中包含 相应的 TRABLES 语句。要关闭自动 集团处理( 关于集团处 理的详细信 息,参见 为数据库表 处理指定集 团 (页 ) ),请使用 CLIENT SPECIFIED 选项。BYPASSING BUFFER 选项使得不 用读取 SAP 表缓冲区就 可直接读取 数据库。如果要保证 操作的是数 据库表的最 新版本,该 选项就是非 常重要的。在 ABAP/4 词典中定义 一个表时, 可以指定 SAP 必须将自己 的本地缓冲 区用于该表 。该缓冲区 被异步更新 。由于 SELECT 语句通常使 用该缓冲区 ,所以没有 必要使用数 据库的最新 版本。要保 证使用的是 最新版本, 请使用 BYPASSING BUFFER 选项。如果最多只 需从数据库 表 中读取 行,请使用 可选规范 UP TO ROWS。 如果 = 0,系统将 读取所有行 ,如果 小于 0,将产生 运行时间错 误。如果将 UP TO ROWS 选项与 ORDER BY 子句组合起 来,系统将 首先给这些 行排序,然 后再处理前 行(关于 ORDER BY 子句的详细 信息,参见 指定行的顺 序 (页 ) )。TABLES SPFLI.SELECT * FROM SPFLI. .ENDSELECT.在该示例中 ,将从数据 库表 SPFLI 中读取所有 行。8在运行时指 定数据库表 的名称可以在运行 时指定数据 库表的名称 。为此,请 按如下格式 使用 FROM 子句:语法.FROM () CLIENT SPECIFIED BYPASSING BUFFER UP TO ROWS. INTO .该格式的 FROM 子句只能与 INTO 子句一起使 用(参见 为选定数据 指定目标区 (页 ) )。字段 的内容确定 了数据库表 的名称。在 该情况下, 程序不必包 含 TABLES 语句。选项 CLIENT SPECIFIED、 BYPASSING BUFFER 和 UP TO ROWS 同样是用于 在程序中指 定数据库表 的名称(参 见 在程序中指 定数据库表 名 (页 ) )。DATA: BEGIN OF WA, LINE(240), END OF WA.DATA NAME(10).NAME = SPFLI.SELECT * FROM (NAME) INTO WA. WRITE: / WA-LINE. ENDSELECT.数据库表名 称 SPFLI 被赋给字符 字段 NAME。 SELECT 语句将所有 的行从 SPFLI 中读到目标 区 WA 中。在该示 例中,WA 与 SPFLI 的结构并不 相同,每一 行都将自动 地转换成字 符字段(详 细信息,参 见 为选定数据 指定目标区 (页 ) 和 Convertibility of Field Strings (页 641) )。因为系统在 ABAP/4 词典中找不 到数据库表 SPFLI, 所以不能用 NAME = spfli 代替 NAME = SPFLI。输出列表的 如下部分表 明将数据写 入文本字段 错误地解释 了一些列:8为选定数据 指定目标区要为选定数 据指定目标 区,请使用 SELECT 语句的 INTO 子句。只有 在需要指定 一个与表工 作区不同的 目标区时才 需要使用该 子句。表工 作区通常由 TABLES 语句自动生 成。如果需 要使用数据 库光标从数 据库表中读 取行,也可 在 FRTCH 语句中指定 INTO 子句(参见 使用光标从 数据库表中 读取行 (页 ) )。INTO 子句有三个 主要变式。 其中两个用 于将数据读 到工作区中 ,而另一个 用于将数据 读到内表中 。这些变式 将在下列主 题中说明。参见第三个变式 用于将数据 读到列表中 。它只能与 SELECT 子句中的列 表一起使用 ,这些将在 选择并处理 指定列中数 据 (页 ) 中进行描述 。如果现在 是将 INTO 子句与 SELECT 子句的列表 一起使用, 那么将根据 目标区结构 将选择的列 从左至右输 出。在 SELECT 语句中没有 列表(SELECT *)的情况 下,所选数 据将从左至 右输出到目 标区中。系 统根据表工 作区的结构 写入数据, 而不考虑目 标区的结构 。要保证能 访问数据库 表单独的列 ,就只能使 用与数据库 表具有相同 结构的目标 区。目标区 的大小至少 要能容下将 读取的行。ABAP/4 词典中的数 据类型与 ABAP/4 编程语言中 的数据类型 不同。如果 在 SELECT 子句中指定 一个列表, 或在 INTO 子句中使用 CORRESPONDING FIELDS 选项,那么 数据库表的 ABAP/4 词典字段必 须能够转换 成 ABAP/4 编程语言的 目标字段。 有关可转换 的数据类型 的列表,参 见 INTO 子句的关键 字文档。9将数据读到 工作区中可以将数据 从数据库表 读到与 TABLES 语句中定义 的默认工作 区不同的工 作区(通常 是字段串) 中。为此,请按 照如下格式 在 SELECT 语句的 INTO 子句中指定 工作区:语法SELECT . INTO .必须为工作 区 声明一个至 少与将读取 的行一样大 的数据对象 。TABLES SPFLI.DATA WA LIKE SPFLI.SELECT * FROM SPFLI INTO WA. WRITE: / WA-CITYFROM, WA-CITYTO.ENDSELECT.在该示例中 ,因为工作 区 WA 的数据类型 是由 DATA 语句中的 LIKE SPFLI 定义的,所 以它有与数 据库表 SPFLI 相同的结构 。因为在 SELECT 循环中使用 了 INTO 子句,所以 将填充工作 区 WA,而不 是 TABLES 语句中所指 定的标准工 作区 SPFLI。 SPFLI 的所有字段 ,即 SPFLI-CITYFROM 和 SPFLI-CITYTO, 都保留为空 。9将数据读到 内表中可以在单个 操作中将数 据库表中行 选择的结果 集写入内表 中。为此,请按 照如下格式 在 SELECT 语句的 INTO 子句中指定 内表:语法SELECT . INTO TABLE .在该情况下 ,SELECT 并不启动循 环,并且不 允许使用 ENDSELECT 语句。如果内表 不是空的, 那么,SELECT 语句将用读 取的数据覆 盖其中的内 容。TABLES SPFLI.DATA ITAB LIKE SPFLI OCCURS 10 WITH HEADER LINE.SELECT * FROM SPFLI INTO TABLE ITAB WHERE CARRID = LH.LOOP AT ITAB. WRITE: / ITAB-CONNID, ITAB-CARRID.ENDLOOP.在该示例中 ,数据库表 SPFLI( 在该数据库 表中 CARRID 字段包含“ LH”)的 所有行都将 读到内表 ITAB 中,并在那 里进一步处 理。将内表指定 为选定行的 目标区时, 可以在包中 处理这些行 或将这些行 附加到内表 中,而不覆 盖表中的内 容。这些选 项的描述如 下。在包中处理 这些行如果需要将 所选行按已 预定义大小 的包的形式 读到内表中 ,请按如下 格式使用 INTO 子句的 PACKAGE SIZE 选项:语法SELECT * . INTO TABLE PACKAGE SIZE .该语句打开 一个循环。 必须使用 ENDSELECT 语句结束该 循环。对于 读取的每个 包含 行的包,系 统都将执行 一次循环。 如果 小于或等于 零,将出现 运行时间错 误。在 SELECT 循环外,无 法确定内表 中的内容。 所以如果希 望进一步处 理所选行, 就必须在循 环中编写相 应的 ABAP/4 语句。TABLES SPFLI.DATA ITAB LIKE SPFLI OCCURS 5 WITH HEADER LINE.SELECT * FROM SPFLI INTO TABLE ITAB PACKAGE SIZE 5 WHERE CARRID = LH. LOOP AT ITAB. WRITE: / ITAB-CARRID, ITAB-CONNID. ENDLOOP. SKIP 1.ENDSELECT.在该示例中 ,数据库表 SPFLI (在该数据 库表中 CARRID 字段包含“ LH”)的 所有行都将 按大小为 5 行的包读到 内表 ITAB 中。在 SELECT 循环内,又 有一个循环 将这些包写 入输出列表 。输出列表 如下所示:将行附加到 内表中为了避免覆 盖内表中的 内容,可将 所选行附加 到此表中。 为此,请按 如下格式使 用 APPENDING 子句,而不 是 INTO 子句:语法SELECT . APPENDING TABLE .与上面描述 的 INTO 子句的唯一 区别是它是 将行附加到 内表 中,而不是 其内容。也 可以在该语 句中使用 PACKAGE SIZE 选项。10逐个组件地 读取数据要一个组件 接一个组件 地将数据读 到目标区中 ,请使用 INTO 子句的 CORRESPONDING FIELDS 选项。语法 如下所示:语法对于将数据 读到工作区 中:SELECT . INTO CORRESPONDING FIELDS OF .对于将数据 读到内表中 :SELECT . INTO CORRESPONDING FIELDS OF TABLE .对于将数据 附加到内表 中:SELECT . APPENDING CORRESPONDING FIELDS OF TABLE .这些语句不 会将所选行 的所有字段 放进目标区 中。系统只 将列的内容 (对于该列 ,目标区中 具有同名组 件)传送到 目标区的对 应组件中。 如果可能, 在传送过程 中,可将值 转换成目标 字段的数据 类型(关于 数据库表和 ABAP/4 数据类型之 间的可转换 性的信息, 参见 INTO 子句的关键 字文档)。TABLES SPFLI.DATA: BEGIN OF WA, NUMBER TYPE I VALUE 1, CITYFROM LIKE SPFLI-CITYFROM, CITYTO LIKE SPFLI-CITYTO, END OF WA.SELECT * FROM SPFLI INTO CORRESPONDING FIELDS OF WA. WRITE: / WA-NUMBER, WA-CITYFROM, WA-CITYTO.ENDSELECT.输出如下所 示:在该示例中 ,系统只将 数据库表 SPFLI 中选定行的 列 CITYFROM 和 CITYTO 传送到 WA 中。WA 中的组件 NUMBER 保持不变。TABLES SBOOK.DATA: BEGIN OF LUGGAGE, AVERAGE TYPE P DECIMALS 2, SUM TYPE P DECIMALS 2, END OF LUGGAGE.SELECT AVG( LUGGWEIGHT ) AS AVERAGE SUM( LUGGWEIGHT ) AS SUM INTO CORRESPONDING FIELDS OF LUGGAGE FROM SBOOK.WRITE: / Average:, LUGGAGE-AVERAGE, / Sum:, LUGGAGE-SUM.该示例为数 据库表 SBOOK 中的所有行 计算了字段 LUGGWEIGHT 的平均值和 总和。总计 表达式 AVG 和 SUM 的结果用选 择性的名称 写入结构 LUGGAGE 的组件 AVERAGE 和 SUM 中。关于总 计表达式和 可选名称的 详细信息, 参见 选择并处理 指定列中数 据 (页 ) 。11选择即将读 取的行如果只希望 访问数据库 表中的符合 某些条件的 行,请使用 SELECT 语句中的 WHERE 子句。参见该主题中说 明的符合开 放式 SQL 的 WHERE 子句不仅用 在 SELECT 语句中,还 用在 UPDATE、 MODIFY 和 DELETE 语句中。11在程序中为 行选择指定 条件要在程序中 为行选择指 定条件,请 按如下格式 使用 WHERE 子句:语法. WHERE .基本 WHERE 条件有六个基本 条件可用于 限制行选择 。描述如下 :1. 是不带作为 前缀的表名 称的数据库 字段名(数 据库表的列 ), 是任意字段 或字母。字 段名称和操 作符必须用 空格隔开。对于 , 可使用下列 字符或字符 串:含 义EQ等于 =等于NE不 等于不 等于不 等于LT小 于小于LE小 于或等于大于GE大 于或等于=大 于或等于. WHERE CARRID = UA.选 定字段 CARRID 的值为“UA” 的所有行。. WHERE NUM GE 15.选定 字段 NUM 中的数字大 于或等于 15 的所有行。. WHERE CITYFROM NE FRANKFURT.选 定字段 CITYFROM 中的字符串 不等于“FRANKFURT” 的所有行。2. NOT BETWEEN AND 数据库字段 的值必须( 不能)处于 字段或字母 和 的值之间才 符合该条件 。. WHERE NUM BETWEEN 15 AND 45.选定 字段 NUM 中的数字位 于 15 和 45 之间的所有 行。. WHERE NUM NOT BETWEEN 1 AND 99.选定 字段 NUM 中的数字不 位于 1 和 99 之间的所有 行。. WHERE NAME NOT BETWEEN A AND H.选 定字段 NAME 中的字符串 的字母顺序 不位于“A” 和“H”之 间的所有行 。3. NOT LIKE ESCAPE 该条件只能 用于字符类 型字段。要符合该条 件,数据库 字段 中的值必须 (不能)符 合 的模式。在 指定 时,可使用 下列两个通 配符:_(下 划线)表示 单个字符%( 百分号)表 示任意字符 串,包括空 字符串例如,ABC_EFG% 能与字符串 ABCxEFGxyz 和 ABCxEFG 匹配,但不 能与 ABCEFGxyz 匹配。. WHERE CITY LIKE %town%. 选定所有包 含“town” 的城市名。. WHERE NAME NOT LIKE _n%. 仅选定第二 个字母不为 “n”的名 称。如果在比较 中要用到两 个通配符, 可使用 ESCAPE 选项。ESCAPE 指定一个忽 略符号 。如 果通配符前 面有 ,那 么通配符和 忽略符号本 身都失去了 它在模式 中的常用功 能。. WHERE FUNCNAME LIKE EDIT#_% ESCAPE #. 选定所有以 “EDIT_” 开始的功能 名称。在 LIKE 条件中使用 通配符 _ 和 % 也符合 SQL 标准。但是 , ABAP/4 比较操作符 CP 和 NP 将识别不同 的通配符( + 和 *)(关于 通配符的详 细信息,参 见比较字符串 和数字串 (页 76) )。4. NOT IN (, ., )要满足该条 件,数据库 字段 中的值必须 (不能)等 于括号内列 表中的一个 值。在该变式中 ,在括号和 比较字段 之间不能有 空格,但在 比较字段之 间可以有空 格。. WHERE CITY IN (Berlin, New York, London). 选定城市“ Berlin” 、“New York” 和“London” 。. WHERE CITY NOT IN (Frankfurt, Rome). 选定除“Frankfurt” 和“Rome” 以外的城市 。5. IS NOT NULL数据库字段 中的值必须 (不能)等 于 NULL 值。6. NOT IN 要满足该条 件,数据库 字段 的值必须( 不能)符合 选择表 中指定的条 件。选择表 是一个特殊 的内表,报 表用户可在 选择屏幕上 填充它。通 常是使用 SELECT-OPTIONS 或 RANGES 来创建选择 表,但是也 可以按照 创建和处理 内表 (页 81) 中的说明定 义。关于选 择表的结构 和示例,参 见 使用选择标 准 (页 Error! Not a valid link.) 。使用逻辑链 接操作符组 合条件可以使用逻 辑链接操作 符 AND、OR 和 NOT 按照任意顺 序来组合六 个基本 WHERE 条件。如果希望指 定几个必须 同时满足的 条件,可按 照下列方法 用 AND 组合它们:.WHERE AND AND AND.如果需要指 定几个条件 ,至少要满 足其中的一 个条件,就 可按照下列 方法用 OR 组合它们:.WHERE OR OR OR.如果只希望 选择那些不 符合指定条 件的表条目 ,就可用 NOT 转化条件, 如下所示:.WHERE NOT NOT 的优先级比 AND 高,AND 的优先级比 OR 高。但是, 可使用括号 来定义处理 的顺序。这 些括号都必 须加空格。.WHERE ( NUMBER = 0001 OR NUMBER = 0002 ) AND NOT ( COUNTRY = F OR COUNTRY = USA ).在该示例中 ,只选择那 些 NUMBER 字段中包含 “0001” 或“0002” 并且 COUNTRY 字段中不包 含“F”或 “USA” 的行。14运行时指定 行选择的条 件可在运行时 为行选择指 定完整的条 件或部分条 件。由于系统只 有在运行时 才能执行语 法检查或生 成内部控制 块,因此运 行时指定条 件比在程序 中指定它们 需要花费更 多的 CPU 时间。并且 ,动态 WHERE 条件只能用 于 SELECT 语句。在运行时指 定完整的条 件语法SELECT.WHERE () . 只能在仅包 含一个类型 为 C 且最大长度 为 72 的字段的内 表 中指定条件 。表名称必 须在括号中 指定,但在 括号和名称 之间没有空 格。可使用 在程序中为 行选择指定 条件 (页 ) 一节中叙述 的语法将本 节中叙述的 所有条件写 到 中。但是也 有下列例外 :_ 使用字母 。不能使用 变量。_ 不能将操 作符 IN 与选择表一 起使用。内表也可保 持为空。TABLES SPFLI.DATA ITAB(72) OCCURS 10 WITH HEADER LINE.PARAMETERS: CITY1(10) TYPE C, CITY2(10) TYPE C.CONCATENATE CITYFROM = CITY1 INTO ITAB.APPEND ITAB.CONCATENATE OR CITYFROM = CITY2 INTO ITAB.APPEND ITAB.CONCATENATE OR CITYFROM = BERLIN INTO ITAB.APPEND ITAB.LOOP AT ITAB. WRITE ITAB.ENDLOOP.SKIP.SELECT * FROM SPFLI WHERE (ITAB). WRITE / SPFLI-CITYFROM.ENDSELECT.在启动该程 序时,PARAMETERS 语句将显示 一个选择屏 幕。这将在 为变量_ 输入字_ (页 Error! Not a valid link.) 中详细说明 。在该示例中 ,将在选择 屏幕上要求 用户输入参 数 CITY1 和 CITY2。 假设该程序 的用户按下 列形式填写 了选择屏幕 的输入区域 :那么将在屏 幕上产生下 列输出:前三行显示 内表 ITAB 的内容。输 出列表表明 仅选定了那 些 CITYFROM 字段中包含 “FRANKFURT” 、“NEW YORK” 或“BERLIN” 的行。在运行时只 指定条件的 一部分要在运行时 指定 SELECT 语句中的条 件的一部分 ,请按下列 格式使用 WHERE 子句:语法SELECT.WHERE AND () . 按照 在程序中为 行选择指定 条件 (页 ) 中的说明在 程序中指定 条件 。必须用 AND 将在运行时 希望在 中指定的部 分条件附加 在 之后。可按照上述 方法指定内 表 。指定条件的 列表要在运行时 指定一系列 条件来选择 一定数目的 特定行,请 在 SELECT 语句中使用 下列 WHERE 子句的特殊 变式:语法SELECT.FOR ALL ENTRIES IN WHERE . 在条件 中,可按前 面的叙述将 内部字段或 字母指定为 比较值。也 可以将内表 的列或字母 用作比较值 。在 WHERE 条件中,这 些列将用作 占位符。该 SELECT 语句的结果 集是 SELECT 语句的所有 结果集的联 合,这些结 果集是用 中的相应值 在每一行上 替换占位符 的结果。将从结果集 中删除重复 行。数据库字段 与内表中的 关联比较字 段必须具有 相同的类型 和长度。不要在数据 库字段和表 字段之间的 比较中使用 操作符 LIKE、 BETWEEN 和 IN。如果使用了 WHERE 子句的该变 式,就不要 使用 ORDER BY 子句。TABLES SPFLI.DATA: BEGIN O

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论