第十一章读取并处理 数据库表.docx

上传人:b****5 文档编号:8311820 上传时间:2023-01-30 格式:DOCX 页数:40 大小:52.19KB
下载 相关 举报
第十一章读取并处理 数据库表.docx_第1页
第1页 / 共40页
第十一章读取并处理 数据库表.docx_第2页
第2页 / 共40页
第十一章读取并处理 数据库表.docx_第3页
第3页 / 共40页
第十一章读取并处理 数据库表.docx_第4页
第4页 / 共40页
第十一章读取并处理 数据库表.docx_第5页
第5页 / 共40页
点击查看更多>>
下载资源
资源描述

第十一章读取并处理 数据库表.docx

《第十一章读取并处理 数据库表.docx》由会员分享,可在线阅读,更多相关《第十一章读取并处理 数据库表.docx(40页珍藏版)》请在冰豆网上搜索。

第十一章读取并处理 数据库表.docx

第十一章读取并处理数据库表

第十一章1读取并处理数据库表

概览

内容

数据库表和SQL概念

从数据库表读取数据

定义选择的结果

指定将读取的数据库表

为选定数据指定目标区

选择即将读取的行

给行分组

指定行的顺序

更改数据库表的内容

向数据库表添加行

在数据库表中更改行

添加或更改行

从数据库表中删除行

使用光标从数据库表中读取行

打开光标

用光标读取数据

如果FETCH语句没有读取任何行,SY-SUBRC就设置为4,否则设置为0。

关闭光标

使用光标读取数据的示例

确认或取消对数据库表的更改

为数据库表处理指定集团

在ABAP/4程序中使用本地的SQL语句

在ABAP/4程序的执行过程中锁定数据库对象

检查ABAP/4程序用户的权限

本节讲述下列主题:

ABAP/4中的SQL概念

ABAP/4的开放式SQL

ABAP/4自身的SQL

锁定和授权

 

在处理来自数据库表的大量数据时,程序的运行时间就成了影响性能的重要因素。

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

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

2数据库表和SQL概念

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

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

Notavalidlink.)。

结构化查询语言(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关键字

关键字

用途

SELECT

从数据库表读取数据(页3)

INSERT

向数据库表添加行(页18)

UPDATE

在数据库表中更改行(页20)

MODIFY

添加或更改行(页22)

DELETE

从数据库表中删除行(页23)

OPENCURSOR,

FETCH,

CLOSECURSOR

使用光标从数据库表中读取行(页25)

COMMITWORK,

ROLLBACKWORK

确认或取消对数据库表的更改(页27)

 

在ABAP/4程序中使用开放式SQL语句时,必须保证:

1)被定址的数据库系统必须是SAP支持的。

2)必须已经在ABAP/4词典中定义了被定址的数据库表。

下列系统字段在开放式SQL操作中起着重要的作用:

_SY-SUBRC

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

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

_SY-DBCNT

SY-DBCNT字段中的值表明受该操作影响的行数,或已被处理的行数。

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

为此,请选择“系统实用程序SQL跟踪”。

详细信息,参见文档ABAP/4工作台工具(页Error!

Notavalidlink.)。

3从数据库表读取数据

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

语法

SELECTFROM[INTO][WHERE]

[GROUPBY][ORDERBY].

该语句有几个基本子句。

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

子句

说明

SELECT

SELECT子句定义选择的结果是单行还是一个表、选择的是哪些列、以及是否将排除相同的行。

定义选择的结果(页3)

FROM

FROM子句指定即将从中选取数据的数据库表或视图

指定将读取的数据库表(页7)

INTO

INTO子句确定即将读入选定数据的目标区

该子句也可以放在FROM子句之前。

如果没有指定INTO子句,系统将使用表工作区。

表工作区是由TANLES语句自动创建的表头行。

为选定数据指定目标区(页8)

WHERE

WHERE子句指定将按照指定的条件读取哪些行来作为选择。

选择即将读取的行(页11)

GROUPBY

GROUP-BY子句从几行组成的组中产生了作为结果的单行。

一个组是在中列出的列中有相同值的行的集合。

给行分组(页16)

ORDERBY

ORDER-BY子句为选定的行定义顺序

指定行的顺序(页17)

关于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。

TABLESSPFLI.

SELECT*FROMSPFLIWHERECITYFROMEQ'FRANKFURT'.

...

WRITE:

/SPFLI-CARRID,SPFLI-CONNID,

SPFLI-CITYFROM,SPFLI-CITYTO.

...

ENDSELECT.

该SELECT循环从SPFLI-CITYFROM字段中包含“FRANKFURT”的SPFLI表中读取所有的行(由WHERE子句指定)。

读取的每一行的数据都由循环中的WRITE语句写入输出列表中。

输出列表如下所示:

4选择单行中的所有数据

要从数据库表中读取单个行的所有列,请按如下方式使用SELECT语句:

语法

SELECTSINGLE[FORUPDATE]*.......WHERE......

该语句的结果是一个单行。

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

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

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

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

可以使用FORUPDATE选项锁定在数据库表中选定的行。

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

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

FORUPDATE选项不是将SAP锁定机制与ENQUEUE/DEQUEUE功能模块一起使用的替代品。

例如,显示一个新的屏幕时,所有用FORUPDATE锁定的行都将自动解锁。

要保证在显示新屏幕时锁定的行保留锁定状态,就必须使用SAP锁定机制。

这是使锁定的行一直到事务的结束都保留其锁定状态的唯一方法。

详细信息,参见在ABAP/4程序的执行过程中锁定数据库对象(页30)

TABLESSPFLI.

SELECTSINGLE*FROMSPFLIWHERECARRIDEQ'LH'

ANDCONNIDEQ'2407'.

WRITE:

/SPFLI-CARRID,SPFLI-CONNID,

SPFLI-CITYFROM,SPFLI-CITYTO.

该SELECT语句只从SPFLI中读取CARRID字段中包含“LH”并且CONNID字段中包含“2407”的行。

输出屏幕如下所示

5选择并处理指定列中数据

要读取显式地包含规定的列的行,或要得到关于数据库表特定列的摘要信息,请按如下方法一起使用SELECT语句与列表:

语法

SELECT[SINGLE[FORUPDATE]][DISTINCT].....

其中每个都具有下列形式之一

_

是数据库表的字段或表单的总计表达式:

([DISTINCT]

关于总计表达式的说明,参见下列内容。

_AS

是结构化目标区的第i个组件的可选名称。

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

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

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

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

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

可按如下方法书写SELECT语句以在运行时指定列:

语法

SELECT[SINGLE[FORUPDATE]][DISTINCT]().

如果内表包含列表....,该语句的操作与上述情况一样。

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

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

总计表达式

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

有效的总计表达式是:

_MAX:

返回列的最大值

_MIN:

返回列的最小值

_AVG:

返回列的平均值

_SUM:

返回列的总计

_COUNT:

按下列方式给值或行计数:

-COUNT(DISTINCT)返回列的不同值的个数。

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

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

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

SELECT子句和INTO子句中的列表

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

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

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

这是一个例外。

通常情况下,选择的数据是根据表工作区的结构从左至右输出到目标区中,而不考虑目标区的结构(关于INTO子句的详细信息,参见为选定数据指定目标区(页8))。

SELECT子句中有一个列表时,可在INTO子句中将列表,,...用作参数:

SELECT....INTO(,,...).

SELECT子句和INTO子句中的列表必须包含相同数目的元素。

如果可能,在传输数据过程中,应将值转换成目标字段的数据类型(数据库表和ABAP/4数据类型之间可转换性的信息,参见有关INTO子句的关键字文档)。

如果在SELECT子句的列表中除总计表达式以外还有一个或多个数据库字段,就必须在GROUP-BY子句中列出所有数据库字段(详细信息,参见给行分组(页16))。

TABLESSPFLI.

DATA:

LIST(72)OCCURS1,

LINE(72).

LINE='CITYFROMCITYTO'.

APPENDLINETOLIST.

SELECTDISTINCT(LIST)

INTOCORRESPONDINGFIELDSOFSPFLIFROMSPFLI.

WRITE:

/SPFLI-CITYFROM,SPFLI-CITYTO.

ENDSELECT.

在该示例中,将列CITYFROM和CITYTO写到内表LIST中,并且只从SPFLI中选择这些列。

选择结果将写到表工作区SPFLI中。

关于INTO子句的CORRESPONDINGFIELDS选项的信息,参见逐个组件地读取数据(页10)。

因为使用了DISRINCT选项,所以将去掉重复的行。

假设下列数据库表TEST由10行组成:

COL_1

COL_2

1

3

2

1

3

5

4

7

5

2

6

3

7

1

8

9

9

4

10

3

要摘录并处理列数据,可使用下列程序:

TABLESTEST.

DATARESULTTYPEPDECIMALS2.

SELECT([DISTINCT]COL_2)INTORESULTFROMTEST.

WRITERESULT.

下表显示了根据总计表达式和DISTINCT选项的不同组合所得到的该程序的结果。

使用的总计表达式

包含的DISTINCT

选项结果

MAX

no

9.00

MAX

yes

9.00

MIN

no

1.00

MIN

yes

1.00

AVG

no

3.80

AVG

yes

4.43

SUM

no

38.00

SUM

yes

31.00

COUNT

yes

7.00

COUNT(*)

---

10.00

7指定将读取的数据库表

要指定将用SELECT语句读取的数据库表或视图,可使用FROM子句。

参见

7在程序中指定数据库表名

要在程序中指定即将读取的数据库表或视图,请按下列格式使用FROM子句:

语法

......FROM[CLIENTSPECIFIED][BYPASSINGBUFFER]

[UPTOROWS].........

数据库表或视图必须对ABAP/4词典有效,并且必须在ABAP/4程序中包含相应的TRABLES语句。

要关闭自动集团处理(关于集团处理的详细信息,参见为数据库表处理指定集团(页28)),请使用CLIENTSPECIFIED选项。

BYPASSINGBUFFER选项使得不用读取SAP表缓冲区就可直接读取数据库。

如果要保证操作的是数据库表的最新版本,该选项就是非常重要的。

在ABAP/4词典中定义一个表时,可以指定SAP必须将自己的本地缓冲区用于该表。

该缓冲区被异步更新。

由于SELECT语句通常使用该缓冲区,所以没有必要使用数据库的最新版本。

要保证使用的是最新版本,请使用BYPASSINGBUFFER选项。

如果最多只需从数据库表中读取行,请使用可选规范UPTOROWS。

如果=0,系统将读取所有行,如果小于0,将产生运行时间错误。

如果将UPTOROWS选项与ORDERBY子句组合起来,系统将首先给这些行排序,然后再处理前行(关于ORDERBY子句的详细信息,参见指定行的顺序(页17))。

TABLESSPFLI.

SELECT*FROMSPFLI.

.....

ENDSELECT.

在该示例中,将从数据库表SPFLI中读取所有行。

8在运行时指定数据库表的名称

可以在运行时指定数据库表的名称。

为此,请按如下格式使用FROM子句:

语法

......FROM()[CLIENTSPECIFIED][BYPASSINGBUFFER]

[UPTOROWS]..INTO.....

该格式的FROM子句只能与INTO子句一起使用(参见为选定数据指定目标区(页8))。

字段的内容确定了数据库表的名称。

在该情况下,程序不必包含TABLES语句。

选项CLIENTSPECIFIED、BYPASSINGBUFFER和UPTOROWS同样是用于在程序中指定数据库表的名称(参见在程序中指定数据库表名(页7))。

DATA:

BEGINOFWA,

LINE(240),

ENDOFWA.

DATANAME(10).

NAME='SPFLI'.

SELECT*FROM(NAME)INTOWA.

WRITE:

/WA-LINE.

ENDSELECT.

数据库表名称SPFLI被赋给字符字段NAME。

SELECT语句将所有的行从SPFLI中读到目标区WA中。

在该示例中,WA与SPFLI的结构并不相同,每一行都将自动地转换成字符字段(详细信息,参见为选定数据指定目标区(页8)和ConvertibilityofFieldStrings(页6–41))。

因为系统在ABAP/4词典中找不到数据库表SPFLI,所以不能用NAME='spfli'代替NAME='SPFLI'。

输出列表的如下部分表明将数据写入文本字段错误地解释了一些列:

8为选定数据指定目标区

要为选定数据指定目标区,请使用SELECT语句的INTO子句。

只有在需要指定一个与表工作区不同的目标区时才需要使用该子句。

表工作区通常由TABLES语句自动生成。

如果需要使用数据库光标从数据库表中读取行,也可在FRTCH语句中指定INTO子句(参见使用光标从数据库表中读取行(页25))。

INTO子句有三个主要变式。

其中两个用于将数据读到工作区中,而另一个用于将数据读到内表中。

这些变式将在下列主题中说明。

参见

第三个变式用于将数据读到列表中。

它只能与SELECT子句中的列表一起使用,这些将在选择并处理指定列中数据(页5)中进行描述。

如果现在是将INTO子句与SELECT子句的列表一起使用,那么将根据目标区结构将选择的列从左至右输出。

在SELECT语句中没有列表(SELECT*)的情况下,所选数据将从左至右输出到目标区中。

系统根据表工作区的结构写入数据,而不考虑目标区的结构。

要保证能访问数据库表单独的列,就只能使用与数据库表具有相同结构的目标区。

目标区的大小至少要能容下将读取的行。

ABAP/4词典中的数据类型与ABAP/4编程语言中的数据类型不同。

如果在SELECT子句中指定一个列表,或在INTO子句中使用CORRESPONDINGFIELDS选项,那么数据库表的ABAP/4词典字段必须能够转换成ABAP/4编程语言的目标字段。

有关可转换的数据类型的列表,参见INTO子句的关键字文档。

9将数据读到工作区中

可以将数据从数据库表读到与TABLES语句中定义的默认工作区不同的工作区(通常是字段串)中。

为此,请按照如下格式在SELECT语句的INTO子句中指定工作区:

语法

SELECT...INTO............

必须为工作区声明一个至少与将读取的行一样大的数据对象。

TABLESSPFLI.

DATAWALIKESPFLI.

SELECT*FROMSPFLIINTOWA.

WRITE:

/WA-CITYFROM,WA-CITYTO.

ENDSELECT.

在该示例中,因为工作区WA的数据类型是由DATA语句中的LIKESPFLI定义的,所以它有与数据库表SPFLI相同的结构。

因为在SELECT循环中使用了INTO子句,所以将填充工作区WA,而不是TABLES语句中所指定的标准工作区SPFLI。

SPFLI的所有字段,即S

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1