当前位置:文档之家› 如何读取并处理数据库表

如何读取并处理数据库表

读取并处理数据库表概览内容数据库表和 SQL 概念 .............................. 2从数据库表读取数据 .............................. 3定义选择的结果................................. 3指定将读取的数据库表.......................... 7为选定数据指定目标区........................... 8选择立即读取的行............................. 11给行分组...................................... 16指定行的顺序................................. 17更改数据库表的内容 ............................ 17向数据库表添加行............................. 18在数据库表中更改行........................... 20添加或更改行................................. 22从数据库表中删除行........................... 23使用光标从数据库表中读取行.................... 25打开光标...................................... 25用光标读取数据............................... 26假如 FETCH 语句没有读取任何行, SY-SUBRC 就设置为4,否则设置为 0。

关闭光标.................... 26使用光标读取数据的示例...................... 26确认或取消对数据库表的更改.................... 27为数据库表处理指定集团........................ 28在 ABAP/4 程序中使用本地的SQL 语句............. 29在 ABAP/4 程序的执行过程中锁定数据库对象...... 30检查 ABAP/4 程序用户的权限..................... 30本节讲述下列主题:ABAP/4 中的 SQL 概念ABAP/4 的开放式 SQLABAP/4 自身的 SQL锁定和授权在处理来自数据库表的大量数据时,程序的运行时刻就成了阻碍性能的重要因素。

有关如何达到最优性能的示例,请选择 ABAP/4 开发工作台中的“测试实时分析”(或使用事务 SE30),并选定“提示和策略”。

在“SQL界面”下,将可找到关于本节的适当示例。

数据库表和 SQL 概念在 R/3 系统中,需长期保存的数据都存储在关系数据库表中。

关于各种类型的数据库表以及如何创建和维护它们的信息,参见文档ABAP/4 词典 (页Error! Not a valid link.) 。

结构化查询语言 (SQL) 是为访问关系数据库创建的。

SQL 有两个语句类型:数据定义语言 (DDL) 语句和数据操作语言 (DML) 语句。

现在,SQL 还没有完全标准化。

要访问指定的数据库系统,必须查阅该系统的文档,以猎取可用的 SQL 语句及其正确的语法的列表。

要在 ABAP/4 程序中包含这些 SQL 语句,请使用自身的 SQL(参见在 ABAP/4 程序中使用本地的SQL 语句 (页29) )。

为了幸免不同的数据库表之间的不兼容性,并使 ABAP/4 程序能在应用中独立于数据库系统,SAP 创建了一套叫作开放式 SQL 的独立 SQL 语句。

开放式 SQL 包含了一套标准的 SQL 语句以及一些专用于 SAP 的增强语句。

使用开放式 SQL,可以访问对 SAP 系统有效的任何数据库表,而不用考虑它的创建者。

下图显示了开放式 SQL 与自身的 SQL 之间的区不:数据库界面可将 SAP 的开放式 SQL 语句翻译成专用于现正使用的数据库的 SQL 命令。

自身的 SQL 直接访问数据库。

开放式 SQL 关键字下列系统字段在开放式 SQL 操作中起着重要的作用:_ SY-SUBRC和使用其它 ABAP/4 语句一样,系统字段 SY-SUBRC 中的返回代码值表示在每个开放式 SQL 操作之后该操作是否成功。

假如操作是成功的,SY-SUBRC 的值就等于 0;假如操作是失败的,SY-SUBRC 的值就不等于 0。

_ SY-DBCNTSY-DBCNT 字段中的值表明受该操作阻碍的行数,或已被处理的行数。

能够使用‘ SQL 跟踪’有用程序监视 SQL 或 ABAP/4 功能的性能。

为此,请选择“系统有用程序S QL跟踪”。

详细信息,参见文档ABAP/4 工作台工具 (页Error! Not a valid link.) 。

从数据库表读取数据要从数据库表读取数据,请使用 SELECT 语句。

语法SELECT <result> FROM <source> [INTO <target>] [WHERE <condition>][GROUP BY <fields>] [ORDER BY <sort_order>].该语句有几个差不多子句。

下表中列出了每一个子句。

子句讲明SELECT <result> SELECT 子句定义选择的结果是单行依旧一个表、选择的是哪些列、以及是否将排除相同的行。

定义选择的结果 (页3)FROM <source> FROM 子句指定即将从中选取数据的数据库表或视图 <source>。

指定将读取的数据库表 (页7)关于 SELECT 语句及其子句性能的重要信息,参见关键字文档。

定义选择的结果SELECT 子句定义是选择单行还是选择多行、是否去掉重复行以及将选择哪些列。

图中显示了可能的选择:有关叙述 SELECT 子句的三个变式的主题,参见选择多行中的所有数据要从数据库表中读取所有列和多行,请按如下方式在循环中使用SELECT 语句。

语法SELECT [DISTINCT] * ................ENDSELECT.必须用 ENDSELECT 语句结束该循环。

该循环依次读取所选行,并为每个读取的行执行循环中的 ABAP/4 语句。

SELECT 循环的结果是与被读取的数据库表的格式完全相同的表。

DISTINCT 选项将自动的去掉重复的行。

假如至少读取了一行,系统字段 SY-SUBRC 就返回 0。

假如没有读取,系统字段 SY-SUBRC 就返回 4。

系统字段 SY-DBCNT 给读取的行计数。

每执行一次 SELECT 语句,SY-DBCNT 都加 1。

选择单行中的所有数据要从数据库表中读取单个行的所有列,请按如下方式使用 SELECT 语句:语法SELECT SINGLE [FOR UPDATE] * ....... WHERE <condition> ......该语句的结果是一个单行。

为了保证清晰地指定了一行,就必须在 WHERE 子句的条件 <condition> 中用 AND 链接形成数据库表主码主码的所有字段。

(关于 WHERE 子句的信息,参见选择立即读取的行 (页11) )。

假如系统没有找到具有指定关键字的行,系统字段 SY-SUBRC 将设置为 4。

假如系统找到了一个完全符合指定条件的行,SY-SUBRC 就返回 0。

能够使用 FOR UPDATE 选项锁定在数据库表中选定的行。

程序将一直等到接收到该锁定。

如果数据库检测到或怀疑有一个死锁定,将产生运行时刻错误。

选择并处理指定列中数据要读取显式地包含规定的列的行,或要得到关于数据库表特定列的摘要信息,请按如下方法一起使用 SELECT 语句与列表:语法SELECT [SINGLE [FOR UPDATE]] [DISTINCT] <s1> <s2> .....其中每个 <s i> 都具有下列形式之一_ <a i><a i> 是数据库表的字段或表单的总计表达式:<aggregate>( [DISTINCT] <a> )关于总计表达式的讲明,参见下列内容。

_ <a i> AS<b i><b i> 是结构化目标区的第 i 个组件的可选名称。

可使用该可选名称将读取或处理指定行的结果写到目标区的组件 <b i> 中。

为此,还必须使用 INTO 子句的CORRESPONDING FIELDS 选项(关于该选项的详细信息及示例,参见逐个组件地读取数据 (页10) )。

DISTINCT 选项将自动地去掉重复行。

假如指定了 SINGLE 选项,选择的结果将由一单行的列 <a1> <a2>... 组成。

将如选择单行中的所有数据 (页4) 中的描述选择该行。

可按如下方法书写 SELECT 语句以在运行时指定列:语法SELECT [SINGLE [FOR UPDATE]] [DISTINCT] (<itab>).假如内表 <itab> 包含列表 <s1> <s2> ....,该语句的操作与上述情况一样。

因此,内表 <itab> 的行类型必须是最大长度为 72,类型为 C 的字段。

如果内表为空,那么,该语句就按照指定的是星号(*)而不是 <itab> 来进行操作。

总计表达式使用总计表达式,可从数据库表的列 <a> 中摘录特征数据。

有效的总计表达式是:_ MAX:返回列 <a> 的最大值_ MIN:返回列 <a> 的最小值_ AVG:返回列 <a> 的平均值_ SUM:返回列 <a> 的总计_ COUNT:按下列方式给值或行计数:- COUNT( DISTINCT <a> ) 返回列 <a> 的不同值的个数。

- COUNT( * ) 返回选定行的总数。

在括号和参数之间必须包含空格。

算术操作符 AVG 和 SUM 只能对数字字段进行操作。

SELECT 子句和 INTO 子句中的列表假如在 SELECT 子句中有一个列表,就必须将 INTO 子句与 SELECT 语句一起使用。

和相关主题中叙述的一样,可以将工作区 <wa> 或内表 <itab> 用作参数。

注意,假如 SELECT 子句包含了一个列表,那么就依照工作区 <wa> 或内表 <itab> 的结构将选择的数据从左至右输出到目标区中。

相关主题