版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 做賬實(shí)操-合同管理制度
- 2025年度文化產(chǎn)業(yè)園項(xiàng)目投資合同3篇
- 2025破產(chǎn)企業(yè)投資權(quán)益轉(zhuǎn)讓合同范本
- 2025專項(xiàng)委托代理合同標(biāo)準(zhǔn)范本
- 2025混凝土外加劑買賣合同書
- 2024年特許經(jīng)營合同范文及應(yīng)用場景
- 2025版金融資產(chǎn)抵押反擔(dān)保風(fēng)險(xiǎn)控制合同3篇
- 2024年紅塔區(qū)政府信息公開與安全合同
- 2024年非正式個(gè)人信貸合同
- 2025版空白離婚協(xié)議書模板制作與法律咨詢服務(wù)合同3篇
- 醫(yī)學(xué)外科的教學(xué)設(shè)計(jì)
- 濟(jì)南 公司章程范本
- AR技術(shù)在教育領(lǐng)域的應(yīng)用與課程設(shè)計(jì)
- 2024年九省聯(lián)考新高考 數(shù)學(xué)試卷(含答案解析)
- 2023年軟件主管年終業(yè)務(wù)工作總結(jié)
- 2019疏浚工程預(yù)算定額
- 笙的演奏技術(shù)與教學(xué)
- 大學(xué)生預(yù)征對象登記表模板
- 《明辨是非》課件
- 重癥監(jiān)護(hù)??谱o(hù)理質(zhì)控考核標(biāo)準(zhǔn)
- 高標(biāo)準(zhǔn)農(nóng)田輸配電工程施工方案與技術(shù)措施
評論
0/150
提交評論