第六章 數據庫操作
6.2.1表字段
在數據字典中,每創建一個數據庫表后,都將同時生成一個同名的結構化數據類型.
6.2.2外部關鍵字
外部關鍵字內容必須在其對應的約束表(check table)中存在,否則無法插入.
6.2.3技術設定
1.數據類型(data class):
l APPL0(Master data),較少需要被修改的系統數據表,如員工個人信息.
l APPL1(Transaction data),需要經常被修改的數據表,如產品庫存量表.
l APPL2(Organization and customizing),系統定制數據表,在系統安裝后很少需要修改,如國家代碼等.
2.數量級別:
0 0 to 6,600
1 6,600 to 26,000
2 26,000 to 100,000
3 100,000 to 420,000
4 420,000 to 34,000,000
3.緩沖(Buffering)機制
如果在緩沖設定中選擇了Buffering switched on項,則需要設定其緩沖類型(有Full,Single-record和Generic三種).
緩沖機制的意義在於首次查詢時將數據表中的數據放入應用服務器緩沖區,以提高后續查詢效率,要注意最好不要對經常需要的數據庫表設置該機制,對于經常讀取但很少更新或者通常只有在60秒后才可能被其他應用服務器程序修改的數據庫表,開啟緩沖機制可以上百倍地提高效率.
4.Log data changes用于設定表中的數據修改時是否在系統日志中記錄.
6.2.4索引
一個數據庫表可以包含一個主索引(Primary Index)和多個附屬索引(Secondary Indexes).主索引只包含表關鍵字和指向整個數據條目的指針,由系統自動生成並在添加數據庫條目時進行維護.索引中的數據已經排序.
6.3.1SELECT語句
SELECT <result> FROM <source> INTO <target>
[WHERE <condition>] [GROUP BY <fields>]
[HAVING <cond>] [ORDER BY <fields>].
l HAVING子句用于限定ORDER BY子句中數據條目組的選擇條件
1.選擇單行數據:
l SELECT SINGLE * FROM tab INTO wa_tab WHERE <condition>.選擇單行全部數據.
l SELECT SINGLE field1 ... fieldn FROM tab INTO (wa_field1,...,wa_fieldn) WHERE <condition>.選擇單行指定字段數據到指定工作區字段.
l SELECT SINGLE *|field1 ... fieldn FROM tab INTO CORRESPONDING FIELDS OF wa_tab WHERE <condition>.將選擇的值放入工作區中對應的字段中.
6.3.3選擇多行數據
1.循環選擇(DISTINCT去掉結果重復的行):
SELECT [DISTINCT] ... .
<statement block>
ENDSELET.
系統字段SY-DBCNT給讀取的行計數.
2.選擇至內表:
SELECT ... INTO|APPENDING [CORRESPONDING FIELDS OF] TABLE itab.
其中INTO選項將復蓋itab中的數據,如果不想復蓋只想追加則用APPENDING.
3.指定選擇包大小(一次選擇到內表的行數):
SELECT * FROM tab INTO|APPENDING TABLE wa_tab PACKAGE SIZE n.
<statement block>
ENDSELET.
6.3.4指定查詢條件
1.比較運算符:=,<,>,<>,<=,>=.
2.範圍限定運算符:WHERE ... f [NOT] BETWEEN g1 AND g2 ....
3.字符比較運算符:WHERE ... f [NOT] LIKE g [ESCAPE h]...其中g中通配符”_”用於替代單個字符,”%”用于替代任意字符串. ESCAPE選項舉例如下:
SELECT ... WHERE city LIKE ‘edit#_%’ ESCAPE ‘#’.選擇所有以”edit_”開始的城市.
4.檢查列表值:WHERE ... f [NOT] IN (g1,...gn)...
5.檢查空值: WHERE ... f IS [NOT] NULL...注:這里的NULL值不等同於初始值INITIAL
6.檢查選擇表.
l WHERE ... f [NOT] IN seltab...其中seltab為選擇表,如選擇屏幕中用戶填充數據.
l SELECT ... WHERE ( code = ‘01’ OR code = ‘02’ ) AND NOT (country = ‘usa’ ).:AND,OR,NOT可以按照任意順序組合.
l SELECT ... WHERE <condition> AND (itab).內表itab僅包含一個類型為C的字段,且最大長度為72.字段中內容不能使用變量.這種方式查詢效率很低.
6.3.5多表結合查詢
1.SELECT語句嵌套
DATA:wa_carrid TYPE spfli-carrid,
wa_connid TYPE spfli-connid,
wa_carrname TYPE scarr-carrname.
SELECT carrid connid
FROM spfli
INTO (wa_carrid,wa_connid)
WHERE cityfrom = 'BOSTON'.
SELECT carrname
FROM scarr
INTO wa_carrname
WHERE carrid = wa_carrid.
WRITE:/ wa_carrname.
ENDSELECT.
ENDSELECT.
2.FOR ALL ENTRIES選項(比上面的嵌套要快)
DATA: BEGIN OF wa_carrid,
carrid TYPE spfli-carrid,
END OF wa_carrid.
DATA:wa_carrid_tab LIKE TABLE OF wa_carrid.
DATA:BEGIN OF wa_carrname,
carrid TYPE scarr-carrid,
carrname TYPE scarr-carrname,
END OF wa_carrname.
SELECT carrid
FROM spfli
INTO TABLE wa_carrid_tab
WHERE cityfrom = 'BOSTON'.
SELECT carrid carrname
FROM scarr
INTO wa_carrname
FOR ALL ENTRIES IN wa_carrid_tab”相當於循環輸出內表在WHERE子句中出現的
WHERE carrid = wa_carrid_tab-carrid.”字段的值
WRITE:/ wa_carrname-carrid, wa_carrname-carrname.
ENDSELECT.
注:此子句中不能使用LIKE,BETWEEN,IN,ORDER BY.