如何讀取并處理數(shù)據(jù)庫表_第1頁
如何讀取并處理數(shù)據(jù)庫表_第2頁
如何讀取并處理數(shù)據(jù)庫表_第3頁
如何讀取并處理數(shù)據(jù)庫表_第4頁
如何讀取并處理數(shù)據(jù)庫表_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

如何讀取并處理數(shù)據(jù)庫表

概覽

內(nèi)容

數(shù)據(jù)庫表與SQL概念..................................................................1

從數(shù)據(jù)庫表讀取數(shù)據(jù)...................................................................3

定義選擇的結(jié)果....................................................................3

指定將讀取的數(shù)據(jù)庫表.............................................................6

為選定數(shù)據(jù)指定目標(biāo)區(qū)..............................................................8

選擇馬上讀取的行..................................................................10

給行分組...........................................................................14

指定行的順序......................................................................15

更換數(shù)據(jù)庫表的內(nèi)容...................................................................16

向數(shù)據(jù)庫表添加行..................................................................16

在數(shù)據(jù)庫表中更換行................................................................18

添加或者更換行....................................................................20

從數(shù)據(jù)庫表中刪除行................................................................21

使用光標(biāo)從數(shù)據(jù)庫表中讀取行..........................................................22

打開光標(biāo)..........................................................................23

用光標(biāo)讀取數(shù)據(jù)....................................................................23

假如FETCH語句沒有讀取任何行,SY-SUBRC就設(shè)置為4,否則設(shè)置為0。關(guān)閉光標(biāo)23

使用光標(biāo)讀取數(shù)據(jù)的示例...........................................................23

確認(rèn)或者取消對數(shù)據(jù)庫表的更換........................................................24

為數(shù)據(jù)庫表處理指定集團(tuán)..............................................................25

在ABAP/4程序中使用本地的SQL語句................................................26

在ABAP/4程序的執(zhí)行過程中鎖定數(shù)據(jù)庫對象...........................................27

檢查ABAP/4程序用戶的權(quán)限..........................................................27

本節(jié)講述下列主題:

ABAP/4中的SQL概念

ABAP/4的開放式SQL

ABAP/4自身的SQL

鎖定與授權(quán)

在處理來自數(shù)據(jù)庫表的大量數(shù)據(jù)時(shí),程序的運(yùn)行時(shí)間就成了影響性能的重要因素。有關(guān)如

何達(dá)到最優(yōu)性能的示例,請選擇ABAP/4開發(fā)工作臺中的“測試今實(shí)時(shí)分析"(或者使用

事務(wù)SE30),并選定“提示與策略”。在“SQL界面”下,將可找到關(guān)于本節(jié)的適當(dāng)示

例。

數(shù)據(jù)庫表與SQL概念

在R/3系統(tǒng)中,需長期儲存的數(shù)據(jù)都存儲在關(guān)系數(shù)據(jù)庫表中。關(guān)于各類類型的數(shù)據(jù)庫表與如何創(chuàng)建與保護(hù)

它們的信息,參見文檔ABAP/4詞典(頁Error!Notavalidlink.)?

結(jié)構(gòu)化查詢語言(SQL)是為訪問關(guān)系數(shù)據(jù)庫創(chuàng)建的。SQL有兩個(gè)語句類型:數(shù)據(jù)定義語言(DDL)語句與數(shù)

據(jù)操作語言(DML)語句。

a

現(xiàn)在,SQL還沒有完全標(biāo)準(zhǔn)化。要訪問指定的數(shù)據(jù)庫系統(tǒng),務(wù)必查閱該系統(tǒng)的文檔,以獲取可用的SQL語

句及其正確的語法的列表。

要在ABAP/4程序中包含這些SQL語句,請使用自身的SQL(參見在ABAP/4程序中使用本地的SQL語

句(頁29))。

為了避免不同的數(shù)據(jù)庫表之間的不兼容性,并使ABAP/4程序能在應(yīng)用中獨(dú)立于數(shù)據(jù)庫系統(tǒng),SAP創(chuàng)建了

一套叫作開放式SQL的獨(dú)立SQL語句。開放式SQL包含了一套標(biāo)準(zhǔn)的SQL語句與一些專用于SAP的增

強(qiáng)語句。使用開放式SQL,可以訪問對SAP系統(tǒng)有效的任何數(shù)據(jù)庫表,而不用考慮它的創(chuàng)建者。

下圖顯示了開放式SQL與自身的SQL之間的區(qū)別:

數(shù)據(jù)庫界面可將SAP的開放式SQL語句翻譯成專用于現(xiàn)正使用的數(shù)據(jù)庫的SQL命令。自身的SQL直接訪

問數(shù)據(jù)庫。

開放式SQL關(guān)鍵字

關(guān)鍵字用途

SELECT從數(shù)據(jù)庫表讀取數(shù)據(jù)(頁3)

INSERT向數(shù)據(jù)庫表添加行(頁18)

UPDATE在數(shù)據(jù)庫表中更換行(頁20)

MODIFY添加或者更換行(頁22)

DELETE從數(shù)據(jù)庫表中刪除行(頁23)

OPENCURSOR,使用光標(biāo)從數(shù)據(jù)庫表中讀取行(頁25)

FETCH,

CLOSECURSOR

COMMITWORK,確認(rèn)或者取消對數(shù)據(jù)庫表的更換(頁27)

ROLLBACKWORK

在ABAP/4程序中使用開放式SQL語句時(shí),必須保證:

1)被定址的數(shù)據(jù)庫系統(tǒng)必須是SAP支持的。

2)務(wù)必己經(jīng)在ABAP/4詞典中定義了被定址的數(shù)據(jù)庫表。

下列系統(tǒng)字段在開放式SQL操作中起著重要的作用:

_SY-SUBRC

與使用其它ABAP/4語句一樣,系統(tǒng)字段SY-SUBRC中的返回代碼值表示在每個(gè)開放式

SQL操作之后該操作是否成功。假如操作是成功的,SY-SUBRC的值就等于0:假如操作

是失敗的,SY-SUBRC的值就不等于0。

_SY-DBCNT

SY-DBCNT字段中的值說明受該操作影響的行數(shù),或者己被處理的行數(shù)。

能夠使用‘SQL跟蹤’有用程序監(jiān)視SQL或者ABAP/4功能的性能。為此,請選擇“系統(tǒng)

->有用程序今SQL跟蹤”。全面信息,參見文檔ABAP/4工作臺工具(頁Error!Notavalid

link.).

從數(shù)據(jù)庫表讀取數(shù)據(jù)

要從數(shù)據(jù)庫表讀取數(shù)據(jù),請使用SELECT語句。

語法

SELECT<result>FROM<source>[INTO<target>][WHERE<condition>]

[GROUPBY<fields>][ORDERBY<sort_order>].

該語句有幾個(gè)基本子句。下表中列出了每一個(gè)子句。一

子句說明

SELECT<rcsult>SELECT子句定義選擇的結(jié)果是單行還是一個(gè)表、選擇的是什么

列、與是否將排除相同的行。

定義選擇的結(jié)果83)

FROM<source>FROM子句指定即將從中選取數(shù)據(jù)的數(shù)據(jù)庫表或者視圖〈source"

指定將讀取的數(shù)據(jù)庫表(頁7)

INTO<target>INTO子句確定即將讀入選定數(shù)據(jù)的目標(biāo)區(qū)(target〉。該子句也可

以放在FROM子句之前。假如沒有指定INTO子句,系統(tǒng)將使用

表工作區(qū)。表工作區(qū)是由TANLES語句自動(dòng)創(chuàng)建的表頭行。

為選定數(shù)據(jù)指定目標(biāo)區(qū)48)

WHERE<condition>WHERE子句指定將按照指定的條件讀取哪些行來作為選擇。

國一選擇馬上讀取的行(頁11)

GROUPBY<felds>GROUP-BY子句從幾行構(gòu)成的組中產(chǎn)生「作為結(jié)果的單行。一個(gè)

組是在〈fields〉中列出的列中有相同值的行的集合。

給行分組816)

ORDERBY<s)rt_order>ORDER-BY子句為選定的行定義順序<sort_order>o

指定行的順序質(zhì)17)

關(guān)司--SELECT語,U及其子句性能的重要信息,參見關(guān)鍵字文檔。

定S.選擇的結(jié)果

SELECT子句定義是選擇單行還是選擇多行、是否去掉重復(fù)行與將選擇什么列。

圖中顯示了可能fJ選擇:

有關(guān)敘述SELECT子句的三個(gè)變式的主題,參見

選擇多行中的所有數(shù)據(jù)

要從數(shù)據(jù)庫表中讀取所有列與多行,請按如下方式在循環(huán)中使用SELECT語句。

語法

SELECT[DISTINCT]*...........

ENDSELECT

務(wù)必用ENDSELECT語句結(jié)束該循環(huán)。

該循環(huán)依次讀取所選行,并為每個(gè)讀取的行執(zhí)行循環(huán)中的ABAP/4語句。SELECT循環(huán)的結(jié)果是與被讀取的

藪褊庫表的格式完全相同的表。

DISTINCT選項(xiàng)將自動(dòng)的去掉重復(fù)的行。

假如至少讀取了一行,系統(tǒng)字段SY-SUBRC就返回0。假如沒有讀取,系統(tǒng)字段SY-SUBRC就返回4。系統(tǒng)

享段SY-DBCNT給讀取的行計(jì)數(shù)。每執(zhí)行一次SELECT語句,SY-DBCNT都加1。

TABLESSPFLI.

SELECT*FROMSPFLIWHERECITYFROMEQ'FRANKFURT,.

WRITE:/SPFLI-CARRID,SPFLI-CONNID,

SPFLI-CITYFROM,SPFLI-CITYTO.

ENDSELECT.

該SELECT循環(huán)從SPFLI-CITYFROM字段中包含“FRANKFURT”的SPFLI表中讀取所有

的行(由WHERE子句指定)。讀取的每一行的數(shù)據(jù)都由循環(huán)中的WRITE語句寫入輸出

列表中。

輸出列表如下所示:

選擇單行中的所有數(shù)據(jù)

要從數(shù)據(jù)庫表中讀取單個(gè)行的所有歹IJ,請按如下方式使用SELECT語句:

語法

SELECTSINGLE[FORUPDATE]*......WHERE<condition>.....

該語句的結(jié)果是一個(gè)單行。為了保證清晰地指定了一行,就務(wù)必在WHERE子句的條件〈condition〉中用

AND鏈接形成數(shù)據(jù)庫表主碼主碼的所有字段。(關(guān)于WHERE子句的信息,參見選擇馬上讀取的行g(shù)l1

1))?

假如系統(tǒng)沒有找到具有指定關(guān)鍵字的行,系統(tǒng)字段SY-SUBRC將設(shè)置為4。假如系統(tǒng)找到了一個(gè)完全符合指

定條件的行,SY-SUBRC就返回0。

能夠使用FORUPDATE選項(xiàng)鎖定在數(shù)據(jù)庫表中選定的行。程序?qū)⒁恢钡鹊浇邮盏皆撴i定。如果數(shù)據(jù)庫檢測

到或者懷疑有一個(gè)死鎖定,將產(chǎn)生運(yùn)行時(shí)間錯(cuò)誤。

FORUPDATE選項(xiàng)不是將SAP鎖定機(jī)制與ENQUEUE/DEQUEUE功能模塊一起使用的替代

品。比如,顯示一個(gè)新的屏幕時(shí),所有用FORUPDATE鎖定的行都將自動(dòng)解鎖。要保證在

顯示新屏幕時(shí)鎖定的行保留鎖定狀態(tài),就務(wù)必使用SAP鎖定機(jī)制。這是使鎖定的行一直到

事務(wù)的結(jié)束都保留其鎖定狀態(tài)的唯一方法。詳細(xì)信息,參見在ABAP/4程序的執(zhí)行過程中

鎖定數(shù)據(jù)庫對象(頁30)

TABLESSPFLI.

SELECTSINGLE*FROMSPFLIWHERECARRIDEQ'LH'

ANDCONNIDEQ,2407'.

WRITE:/SPFLI-CARRID,SPFLI-CONNID,

SPFLI-CITYFROM,SPFLI-CITYTO.

該SELECT語句只從SPFLI中讀取CARRID字段中包含"LH”并且CONNID字段中包含

“2407”的行。

輸出屏幕如下所示

選擇并處理指定列中數(shù)據(jù)

要讀取顯式地包含規(guī)定的列的行,或者要得到關(guān)于數(shù)據(jù)庫表特定列的摘要信息,請按如下方法一起使用

SELECT語句與列表:

語法

SELECT[SINGLE[FORUPDATE]][DISTINCT]<Si><s2>....

其中每個(gè)<Si>都具有下列形式之一

_<a1>

<ai>是數(shù)據(jù)庫表的字段或者表單的總計(jì)表達(dá)式:

<aggregate>([DISTINCT]<a>)

關(guān)于總計(jì)表達(dá)式的說明,參見下列內(nèi)容。

<a[>AS<bi>

一<bi>是結(jié)構(gòu)化目標(biāo)區(qū)的第i個(gè)組件的可選名稱??墒褂迷摽蛇x名稱將讀取或者處理指定

行的結(jié)果寫到目標(biāo)區(qū)的組件<bi>中。為此,還務(wù)必使用INTO子句的CORRESPONDING

FIELDS選項(xiàng)(關(guān)于該選項(xiàng)的詳細(xì)信息及示例,參見逐個(gè)組件地讀取數(shù)據(jù)810))。

DISTINCT選項(xiàng)將自動(dòng)地去掉重復(fù)行。

假如指定了SINGLE選項(xiàng),選擇的結(jié)果將由一單行的列<ai><a2>...構(gòu)成。將如選擇單行中的所有數(shù)據(jù)84)

中的描述選擇該行。

可按如下方法書寫SELECT語句以在運(yùn)行時(shí)指定列:

語法

SELECT[SINGLE[FORUPDATE]][DISTINCT](<itab>).

假如內(nèi)表vitab>包含列表<si><S2>....,該語句的操作與上述情況一樣。因此,內(nèi)表vitab>的行類型必須是

最大長度為72,類型為C的字段。如果內(nèi)表為空,那么,該語句就按照指定的是星號(*)而不是vitab>

來進(jìn)行操作。

總計(jì)表達(dá)式

使用總計(jì)表達(dá)式,可從數(shù)據(jù)庫表的列<a>中摘錄特征數(shù)據(jù)。有效的總計(jì)表達(dá)式是:

_MAX:返回列<a>的最大值

_MIN:返回列<a>的最小值

_AVG:返回列<a>的平均值

_SUM:返回列<a>的總計(jì)

_COUNT:按下列方式給值或者行計(jì)數(shù):

-COUNT(DISTINCT<a>)返回列va>的不一致值的個(gè)數(shù)。

-COUNT(*)返回選定行的總數(shù)。

在括號與參數(shù)之間務(wù)必包含空格。算術(shù)操作符AVG與SUM只能對數(shù)字字段進(jìn)行操作。

SELECT子句與INTO子句中的列表

假如在SELECT子句中有一個(gè)列表,就務(wù)必將INTO子句與SELECT語句一起使用。與有關(guān)主題中敘述的

?樣,可以將工作區(qū)<wa>或者內(nèi)表vitab>用作參數(shù)。注意,假如SELECT子句包含了一個(gè)列表,那么就根

據(jù)工作區(qū)<wa>或者內(nèi)表vitab)的結(jié)構(gòu)將選擇的數(shù)據(jù)從左至右輸出到目標(biāo)區(qū)中o這是一個(gè)例外。通常情況

下,選擇的數(shù)據(jù)是根據(jù)表工作區(qū)的結(jié)構(gòu)從左至右輸出到目標(biāo)區(qū)中,而不考慮目標(biāo)區(qū)的結(jié)構(gòu)(關(guān)于INTO子

句的全面信息,參見為選定數(shù)據(jù)指定目標(biāo)區(qū)B8))。

SELECT子句中有一個(gè)列表時(shí),可在INTO子句中將列表<F1>,<F2>,...用作參數(shù):

SELECT<ai><a2>..??INTO(<F1>,<F2>,...).

SELECT子句與INTO子句中的列表務(wù)必包含相同數(shù)目的元素。假如可能,在傳輸數(shù)據(jù)過程中,應(yīng)將值轉(zhuǎn)

換成口標(biāo)字段的數(shù)據(jù)類型(數(shù)據(jù)庫表與ABAP/4數(shù)據(jù)類型之間可轉(zhuǎn)換性的信息,參見有關(guān)INTO子句的關(guān)鍵

字文檔)。假如在SELECT子句的列表中除總計(jì)表達(dá)式以外還有一個(gè)或者多個(gè)數(shù)據(jù)庫字段,就務(wù)必在

GROUP-BY子句中列出所有數(shù)據(jù)庫字段(全面信息,參見給行分組B16))。

TABLESSPFLI.

DATA:LIST(72)OCCURS1,

LINE(72).

LINE='CITYFROMCITYTO1.

APPENDLINETOLIST.

SELECTDISTINCT(LIST)

INTOCORRESPONDINGFIELDSOFSPFLIFROMSPFLI.

WRITE:/SPFLI-CITYFROM,SPFLI-CITYTO.

ENDSELECT.

在該示例中,將列CITYFROM與CITYTO寫到內(nèi)表LIST中,同時(shí)只從SPFL1中選擇這些

列。選擇結(jié)果將寫到表工作區(qū)SPFLI中。關(guān)于INTO子句的CORRESPONDINGFIELDS選

項(xiàng)的信息,參見逐個(gè)組件地讀取數(shù)據(jù)OR10)o由于使用了DISRINCT選項(xiàng),因此將去

掉重復(fù)的行。

假設(shè)下列數(shù)據(jù)庫表TEST由10行構(gòu)成:

COL_1COL_2

13

21

35

47

52

63

71

89

94

103

要摘錄并處理列數(shù)據(jù),可使用下列程序:

TABLESTEST.

DATARESULTTYPEPDECIMALS2.

SELECT<agg>([DISTINCT]C0L_2)INTORESULTFROMTEST.

WRITERESULT.

下表顯示了根據(jù)總計(jì)表達(dá)式<agg>與DISTINCT選項(xiàng)的不?致組合所得到的該程序的結(jié)

果。

使用的總計(jì)表達(dá)式包含的DISTINCT選項(xiàng)結(jié)果

MAXno9.00

MAXyes9.00

MINno1.00

MINyes1.00

AVGno3.80

AVGyes4.43

SUMno38.00

SUMyes31.0()

COUNTyes7.00

COUNT(*)一10.00

指定將讀取的數(shù)據(jù)庫表

要指定將用SELECT語句讀取的數(shù)據(jù)庫表或者視圖,可使用FROM子句。

參見

在程序中指定數(shù)據(jù)庫表名

要在程序中指定馬上讀取的數(shù)據(jù)庫表或者視圖,請按下列格式使用FROM子句:

語法

.....FROM<dbtab>[CLIENTSPECIFIED][BYPASSINGBUFFER]

[UPTO<n>ROWS]........

數(shù)據(jù)庫表或者視圖<dbtab>務(wù)必對ABAP/4詞典有效,同時(shí)務(wù)必在ABAP/4程序中包含相應(yīng)的TRABLES語

句。

要關(guān)閉自動(dòng)集團(tuán)處理(關(guān)于集團(tuán)處理的全面信息,參見為數(shù)據(jù)庫表處理指定集用(頁28)),請使用

CLIENTSPECIFIED選項(xiàng)。

BYPASSINGBUFFER選項(xiàng)使得不用讀取SAP表緩沖區(qū)就可直接讀取數(shù)據(jù)庫。

假如要保證操作的是數(shù)據(jù)庫表的最新版本,該選項(xiàng)就是非常重要的。

在ABAP/4詞典中定義?個(gè)表時(shí),能夠指定SAP務(wù)必將自己的本地緩沖區(qū)用于該表。該緩沖區(qū)被異步更新。

由于SELECT語句通常使用該緩沖區(qū),因此沒有必要使用數(shù)據(jù)庫的最新版本。要保證使用的是最新版本,請

使用BYPASSINGBUFFER選項(xiàng)。

假如最多只需從數(shù)據(jù)庫表<dbtab>中讀?。糿>行,請使用可選規(guī)范UPTO<n>ROWS,假如<n>=0,系統(tǒng)

將讀取所有行,假如<n>小于0,將產(chǎn)生運(yùn)行時(shí)間錯(cuò)誤。

假如將UPTO<n>ROWS選項(xiàng)與ORDERBY子句組合起來,系統(tǒng)將首先給這些行排序,然后再處理前<n>

行(關(guān)于ORDERBY子句的全面信息,參見指定行的順序通17))。

TABLESSPFLI.

SELECT*FROMSPFLI.

ENDSELECT.

在該示例中,將從數(shù)據(jù)庫表SPFLI中讀取所有行。

在運(yùn)行時(shí)指定數(shù)據(jù)庫表的名稱

能夠在運(yùn)行時(shí)指定數(shù)據(jù)庫表的名稱?為此,請按如下格式使用FROM子句:

語法

.....FROM(<dbtabname>)[CLIENTSPECIFIED][BYPASSINGBUFFER]

[UPTO<n>ROWS]..INTO<target>....

該格式的FROM子句只能與INTO子句一起使用(參見為選定數(shù)據(jù)指定目標(biāo)區(qū)⑦8)

字段<dbtabname>的內(nèi)容確定了數(shù)據(jù)庫表的名稱。在該情況下,程序不必包含TABLES語句。選項(xiàng)CLIENT

SPECIFIED.BYPASSINGBUFFER與UPTO<n>ROWS同樣是用于在程序中指定數(shù)據(jù)庫表的名稱(參見在

程序中指定數(shù)據(jù)庫表名(頁6))。

DATA:BEGINOFWA,

LINE(240),

ENDOFWA.

DATANAME(10).

NAME='SPFLI'.

SELECT*FROM(NAME)INTOWA.

WRITE:/WA-LINE.

ENDSELECT.

數(shù)據(jù)庫表名稱SPFLI被賦給字符字段NAME。SELECT語句將所有的行從SPFL1中讀到目

標(biāo)區(qū)WA中。在該示例中,WA與SPFLI的結(jié)構(gòu)先不相同,每一行都將自動(dòng)地轉(zhuǎn)換成字符

字段(詳細(xì)信息,參見為選定數(shù)據(jù)指定目標(biāo)區(qū)便8)與ConvertibilityofFieldStrings(Ji

6-41))?

由于系統(tǒng)在ABAP/4詞典中找不到數(shù)據(jù)庫表SPFLI,因此不能用NAME=代替

NAME='SPFLI'。

輸出列表的如下部分表明將數(shù)據(jù)寫入文本字段錯(cuò)誤地解釋了一些列:

為選定數(shù)據(jù)指定目標(biāo)區(qū)

要為選定數(shù)據(jù)指定目標(biāo)區(qū),請使用SELECT語句的INTO子句。只有在需要指定一個(gè)與表工作區(qū)不一致的目

標(biāo)區(qū)時(shí)才需要使用該子句。表工作區(qū)通常由TABLES語句自動(dòng)生成。假如需要使用數(shù)據(jù)庫光標(biāo)從數(shù)據(jù)庫表

中讀取行,也可在FRTCH語句中指定INTO子句(參見使用光標(biāo)從數(shù)據(jù)庫表中讀取行(頁25))。

INTO子句有三個(gè)要緊變式。其中兩個(gè)用于將數(shù)據(jù)讀到工作區(qū)中,而另一個(gè)用于將數(shù)據(jù)讀到內(nèi)表中。這些變

式將在下列主題中說明。

參見

第三個(gè)變式用于將數(shù)據(jù)讀到列表中。它只能與SELECT子句中的列表一起使用,這些將在選擇并處理指定

列中數(shù)據(jù)?4)中進(jìn)行描述。假如現(xiàn)在是將INTO子句與SELECT子句的列表一起使用,那么將根據(jù)R

標(biāo)區(qū)結(jié)構(gòu)將選擇的列從左至右輸出。

在SELECT語句中沒有列表(SELECT*)的情況下,所選數(shù)據(jù)將從左至右輸出到目標(biāo)區(qū)中。系統(tǒng)根據(jù)表工作

區(qū)的結(jié)構(gòu)寫入數(shù)據(jù),而不考慮目標(biāo)區(qū)的結(jié)構(gòu).要保證能訪問數(shù)據(jù)庫表單獨(dú)的列,就只能使用與數(shù)據(jù)庫表具

有相同結(jié)構(gòu)的目標(biāo)區(qū)。目標(biāo)區(qū)的大小至少要能容下將讀取的行。

ABAP/4詞典中的數(shù)據(jù)類型與ABAP/4編程語言中的數(shù)據(jù)類型不一致。假如在SELECT子

句中指定一個(gè)列表,或者在INTO子句中使用CORRESPONDINGFIELDS選項(xiàng),那么數(shù)據(jù)庫

表的ABAP/4詞典字段必須能夠轉(zhuǎn)換成ABAP/4編程語言的目標(biāo)字段。有關(guān)可轉(zhuǎn)換的數(shù)據(jù)

類型的列表,參見INTO子句的關(guān)鍵字文檔。

將數(shù)據(jù)讀到工作區(qū)中

能夠?qū)?shù)據(jù)從數(shù)據(jù)庫表讀到與TABLES語句中定義的默認(rèn)工作區(qū)不一致的工作區(qū)(通常是字段串)中。

為此,請按照如下格式在SELECT語句的INTO子句中指定工作區(qū):

語法

SELECT…INTO<wa>...........

務(wù)必為工作區(qū)<wa>聲明一個(gè)至少與將讀取的行一樣大的數(shù)據(jù)對象.

TABLESSPFLI.

DATAWALIKESPFLI.

SELECT*FROMSPFLIINTOWA.

WRITE:/WA-CITYFROM,WA-CITYTO.

ENDSELECT.

在該示例中,由于工作區(qū)WA的數(shù)據(jù)類型是由DATA語句中的LIKESPFLI定義的,所以

它有與數(shù)據(jù)庫表SPFLI相同的結(jié)構(gòu)。由于在SELECT循環(huán)中使用了INTO子句,因此將填

充工作區(qū)WA,而不是TABLES語句中所指定的標(biāo)準(zhǔn)工作區(qū)SPFLLSPFLI的所有字段,

即SPFLI-CITYFROM與SPFLI-CITYTO,都保留為空。

將數(shù)據(jù)讀到內(nèi)表中

能夠在單個(gè)操作中將數(shù)據(jù)庫表中行選擇的結(jié)果集寫入內(nèi)表中。

為此,請按照如下格式在SELECT語句的INTO子句中指定內(nèi)表:

語法

SELECT....INTOTABLE<itab>.

在該情況下,SELECT并不啟動(dòng)循環(huán),同時(shí)不同意使用ENDSELECT語句。

假如內(nèi)表<itab>不是空的,那么,SELECT語句將用讀取的數(shù)據(jù)覆蓋其中的內(nèi)容。

TABLESSPFLI.

DATAITABLIKESPFLIOCCURS10WITHHEADERLINE.

SELECT*FROMSPFLIINTOTABLEITAB

WHERECARRID='LH'.

LOOPATITAB.

WRITE:/ITAB-CONNID,ITAB-CARRID.

ENDLOOP.

在該示例中,數(shù)據(jù)庫農(nóng)SPFLI(在該數(shù)據(jù)庫表中CARRID字段包含“LH”)的所有行都將

讀到內(nèi)表ITAB中,并在那里進(jìn)一步處理。

將內(nèi)表指定為選定行的目標(biāo)區(qū)時(shí),能夠在包中處理這些行或者將這些行附加到內(nèi)表中,而不覆蓋表中的內(nèi)

容。這些選項(xiàng)的描述如下。

在包中處理這些行

假如需要將所選行按己預(yù)定義大小的包的形式讀到內(nèi)表中,請按如下格式使用INTO子句的PACKAGESIZE

選項(xiàng):

語法

*TNTQTABLEPACKAGESTZE<n>

該語句打開二不扃環(huán)。務(wù)必使用ENDSELECT語句結(jié)束該循環(huán);美宇讀取的每個(gè)包含<n>行的包,系統(tǒng)都

將執(zhí)行一次循環(huán)。假如<n>小于或者等于零,將出現(xiàn)運(yùn)行時(shí)間錯(cuò)誤。

在SELECT循環(huán)外,無法確定內(nèi)表中的內(nèi)容。因此假如希望進(jìn)?步處理所選行,就務(wù)必在

循環(huán)中編寫相應(yīng)的ABAP/4語句。

TABLESSPFLI.

DATAITABLIKESPFLIOCCURS5WITHHEADERLINE.

SELECT*FROMSPFLIINTOTABLEITABPACKAGESIZE5

WHERECARRID='LH'.

LOOPATITAB.

WRITE:/ITAB-CARRID,ITAB-CONNID.

ENDLOOP.

SKIP1.

ENDSELECT.

在該示例中,數(shù)據(jù)庫表SPFLI(在該數(shù)據(jù)庫表中CARRID字段包含“LH”)的所有行都將

按大小為5行的包讀到內(nèi)表ITAB中。在SELECT循環(huán)內(nèi),又有一個(gè)循環(huán)將這些包寫入輸

出列表。輸出列表如下所示:

將行附加到內(nèi)表中

為了避免覆蓋內(nèi)表中的內(nèi)容,可將所選行附加到此表中。為此,請按如下格式使用APPENDING子句,而

不是INTO子句:

語法

SELECT....APPENDINGTABLE<itab>....

與上面描述的INTO子句的唯一區(qū)別是它是將行附加到內(nèi)表<itab>中,而不是其內(nèi)容。也能夠在該語句中

使用PACKAGESIZE選項(xiàng)。

逐個(gè)組件地讀取數(shù)據(jù)

要一個(gè)組件接一個(gè)組件地將數(shù)據(jù)讀到目標(biāo)區(qū)中,請使用INTO子句的CORRESPONDINGFIELDS選項(xiàng)。語法

如下所示:

語法

關(guān)于將數(shù)據(jù)讀宣工作區(qū)中:

SELECT.??INTOCORRESPONDINGFIELDSOF<wa>.......

關(guān)于將數(shù)據(jù)讀到內(nèi)表中:

SELECT…INTOCORRESPONDINGFIELDSOFTABLE<itab>.......

關(guān)于將數(shù)據(jù)附加到內(nèi)表中:

SELECT…APPENDINGCORRESPONDINGFIELDSOFTABLE<itab>.......

這些語句不會(huì)將所選行的所有字段放進(jìn)目標(biāo)區(qū)中。系統(tǒng)只將列的內(nèi)容(關(guān)于該列,目標(biāo)區(qū)中具有同名組件)

傳送到目標(biāo)區(qū)的對應(yīng)組件中。假如可能,在傳送過程中,可將值轉(zhuǎn)換成目標(biāo)字段的數(shù)據(jù)類型(關(guān)于數(shù)據(jù)庫

表與ABAP/4數(shù)據(jù)類型之間的可轉(zhuǎn)換性的信息,參見INTO子句的關(guān)鍵字文檔)。

TABLESSPFLI.

DATA:BEGINOFWA,

NUMBERTYPEIVALUE1,

CITYFROMLIKESPFLI-CITYFROM,

CITYTOLIKESPFLI-CITYTO,

ENDOFWA.

SELECT*FROMSPFLIINTOCORRESPONDINGFIELDSOFWA.

WRITE:/WA-NUMBER,WA-CITYFROM,WA-CITYTO.

ENDSELECT.

輸出如下所示:

在該示例中,系統(tǒng)只將數(shù)據(jù)庫表SPFLI中選定行的列CITYFROM與CITYTO傳送到WA

中。WA中的組件NUMBER保持不變。

TABLESSBOOK.

DATA:BEGINOFLUGGAGE,

AVERAGETYPEPDECIMALS2,

SUMTYPEPDECIMALS2,

ENDOFLUGGAGE.

SELECTAVG(LUGGWEIGHT)ASAVERAGE

SUM(LUGGWEIGHT)ASSUM

INTOCORRESPONDINGFIELDSOFLUGGAGEFROMSBOOK.

WRITE:/*1Average:1,LUGGAGE-AVERAGE,/'Sum:1,LUGGAGE-SUM.

該示例為數(shù)據(jù)庫表SBOOK中的所有行計(jì)算了字段LUGGWEIGHT的平均值與總與??傆?jì)

表達(dá)式AVG與SUM的結(jié)果用選擇性的名稱寫入結(jié)構(gòu)LUGGAGE的組件AVERAGE與

SUM中。關(guān)于總計(jì)表達(dá)式與可選名稱的全面信息,參見選擇并處理指定列中數(shù)據(jù)(頁

4)。

選擇馬上讀取的行

假如只希望訪問數(shù)據(jù)庫表中的符合某些條件的行,請使用SELECT語句中的WHERE子句。

參見

該主題中說明的符合開放式SQL的WHERE子句不僅用在SELECT語句中,還用在

UPDATE>MODIFY與DELETE語句中。

在程序中為行選擇指定條件

要在程序中為行選擇指定條件,請按如下格式使用WHERE子句:

語法

WHERE<condition>

基本W(wǎng)HERE條件

有六個(gè)基本條件可用于限制行選擇?描述如下:

1.<f><operator><g>

<f>是不帶作為前綴的表名稱的數(shù)據(jù)庫字段名(數(shù)據(jù)庫表的列),<g>是任意字段或者字母。字段名稱與操作

符務(wù)必用空格隔開。

關(guān)于〈operator〉,可使用卜.列字符或者字符串:__________________

<operator>含義

EQ等于

=等于

NE不等于

<>不等于

><不等于

LT小于

<小于

LE小于或者等于

<=小于或者等于

GT大于

>大于

GE大于或者等于

>=大于或者等于

.......WHERECARRID='UA'.

選定字段CARRID的值為“UA”的所有行。

WHERENIIMRR1R

謔比季蕨NUM中的數(shù)字大于能者等于15的所有行。

.......WHERECITYFROMNE'FRANKFURT'.

選定字段CITYFROM中的字符串不等于“FRANKFURT”的所有行。

2.<f>[NOT]BETWEEN<gi>AND<g2>

數(shù)據(jù)庫字段vf>的值務(wù)必(不能)處于字段或者字母vg>與vg2>的值之間才符合該條件。

.......WHERENUMBETWEEN15AND45.

選定字段NUM中的數(shù)字位于15與45之間的所有行。

.......WHERENUMNOTBETWEEN1AND99.

選定字段NUM中的數(shù)字不位于1與99之間的所有行。

.......WHERENAMENOTBETWEEN'A1AND'Hf.

選定字段NAME中的字符串的字母順序不位于“A”與"H”之間的所有行。

3.<f>[NOT]LIKE<g>[ESCAPE<h>]

該條件只能用于字符類型字段。

要符合該條件,數(shù)據(jù)庫字段<f>中的值務(wù)必(不能)符合<g>的模式。在指定<g>時(shí),可使用下列兩個(gè)通

配符:

_(下劃線)表示單個(gè)字符

%(百分號)表示任意字符串,包含空字符串

比如,ABC_EFG%能與字符串ABCxEFGxyz與ABCxEFG匹配,但不能與ABCEFGxyz匹配。

....WHERECITYLIKE'%town%,.

選定所有包含“town”的城市名。

....WHERENAMENOTLIKE'n%'.

僅選定第二個(gè)字母不為“n”的名稱。

假如在比較中要用到兩個(gè)通配符,可使用ESCAPE選項(xiàng)。ESCAPE<h>指定一個(gè)忽略符號<h>?如果通配符

前面有<h>,那么通配符與忽略符號本身都失去了它在模式<g>中的常用功能。

....WHEREFUNCNAMELIKE'EDIT#%'ESCAPE'#1.

選定所有以“EDIT」開始的功能名稱。

在LIKE條件中使用通配符一與%也符合SQL標(biāo)準(zhǔn)。但是,ABAP/4比較操作符CP與

NP將識別不一致的通配符(+與*)(關(guān)于通配符的詳細(xì)信息,參見比較字符串與數(shù)字串

(頁7-6)).

4.<f>

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論