第六章 數據庫操作
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
[WHERE
[HAVING
l HAVING子句用于限定ORDER BY子句中數據條目組的選擇條件
1.選擇單行數據:
l SELECT SINGLE * FROM tab INTO wa_tab WHERE
l SELECT SINGLE field1 ... fieldn FROM tab INTO (wa_field1,...,wa_fieldn) WHERE
l SELECT SINGLE *|field1 ... fieldn FROM tab INTO CORRESPONDING FIELDS OF wa_tab WHERE
6.3.3選擇多行數據
1.循環選擇(DISTINCT去掉結果重復的行):
SELECT [DISTINCT] ... .
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.
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
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.
3.使用視圖:可先用SE11創建視圖然后查詢,效率更高.
4.結合查詢
SELECT ... FROM table [INNER] JOIN jointab1 [AS alias1] ON
[INNER] JOIN jointab2 [AS alias2] ON
WHERE
SELECT ... FROM table LEFT [OUTER] JOIN jointab1 [AS alias1] ON
5.子查詢(沒有INTO子句,不能結合ON同時出現,可嵌套)
l SELECT ... FROM scar INTO
WHERE EXIST ( SELECT * FROM spfli
WHERE carrid = scarr-carrid
AND cityfrom = ‘BOSTON’ ).
l ...WHERE city IN ( SELECT cityfrom FROM spfli WHERE ...只返回單個字段.
l ...WHERE city = ( SELECT cityfrom FROM spfli WHERE ...單行返回結果.
l ... WHERE city > ALL|ANY|SOME ( SELECT cityfrom FROM spfli WHERE ...多行返回值.
6.3.6組合查詢結果
1.總計功能
SELECT MAX|MIN|SUM|AVG|COUNT( [DISTINCT] f1 ) [AS a1]...其中DISTINCT選項將在統計之前先排除相同的選擇結果.
2.分組總計
SELECT f1 [AS a1] ... MAX|MIN|SUM|AVG|COUNT( [DISTINCT] fm ) [AS am] ...
INTO (s1,...,sm...)|CORRESPONDING FIELDS OF itab...
GROUP BY f1...
注:分組總計必須指定查詢字段或使用INTO CORRESPONDING FIELDS OF附加項,使用后者時需要通過AS后面的別名將總計結果存放在與別名同名的字段中.
3.指定分組條件
SELECT f1 [AS a1] ... MAX|MIN|SUM|AVG|COUNT( [DISTINCT] fm ) [AS am] ...
INTO (s1,...,sm...)|CORRESPONDING FIELDS OF itab...
GROUP BY f1...
HAVING
4.排序(SQL Trace工具查看數據庫索引)
l ...ORDER BY PRIMARY KEY.系統將按主關鍵字升序排序.
l ...ORDER BY f1 [ASCENDING|DESCENDING] ...指定字段,默認升序.
6.3.7其它格式說明
l TABLSE dbtab.聲明與數據庫表同名同結構的工作區,是一種結構體對象,不是內表.
l dbname = ‘EKBE’.SELECT f1... FROM (dbname) INTO (s1,...)...動態指定數據庫表,注意數據庫表名必須大寫.
l SELECT|UPDATE ... FROM dbtab CLIENT SPECIFIED WHERE mandt BETWEEN ‘100’ AND ‘103’.用CLIENT SPECIFIED選項取消系統自動處理當前集團數據表功能,同時就可以在WHERE子句中指定需要讀取的集團.
l SELECT ... FROM dbtab BYPASSING BUFFER...取消TABLE技術設定中設定的緩沖機制,另,DISTINCT附加項與結合選擇,總計選擇,IS NULL條件,子查詢,以及GROUP BY和ORDER BY同時使用時,也將自動忽略緩沖設定.
l SELECT ... FROM dbtab UP TO n ROWS...只選取滿足條件的n行數據,如果n為0,則選取所有滿足條件的數據,如果同時使用ORDER BY子句,則系統首先先出所有滿足條件的數據並排序,然后將頭n行作為選擇結果.
l GET RUN TIME FIELD f.系統返回從程序開始后的毫秒數,其中f為I類型數據.
6.3.8使用光標(多個光標可指向同一個選擇)
DATA: cur TYPE cursor.
OPEN CURSOR cur FOR SELECT carrid FROM spfli WHERE cityfrom = 'BOSTON'.打開光標.
DO.
FETCH NEXT CURSOR cur INTO (wa_carrid_tab-carrid).相當於循環讀取OPEN CURSOR語句生成的結果集中的下一行數據.
APPEND wa_carrid_tab.
或者FETCH NEXT CURSOR cur INTO TABLE wa_carrid_tab.整體讀取放放內表.
IF sy-subrc <> 0.如果FETCH語句沒有讀取任何行, sy-subrc返回4,否則返回0.
CLOSE CURSOR cur.關閉光標.
EXIT.
ENDIF.
ENDDO.
在SELECT語句中,數據從數據庫中以大小為32KB的數據包傳遞至應用服務器,並通過INTO子句傳至ABAP程序.
6.4更新數據
數據庫操作結束后通過SY-SUBRC返回標識代碼,如果操作成功,返回0,另SY-DBCUT還將返回實際操作的數據行數.
6.4.1 INSERT語句(數據庫表必須是可維護狀態)
l INSERT INTO dbtab|view VALUES wa.插入單行,視圖數據必須來自同一個表.
l INSERT INTO dbtab|view FROM wa. 插入單行,視圖數據必須來自同一個表.
l INSERT dbtab FROM TABLE itab.當有一條數據插入失敗,系統不更新任何數據.
l INSERT dbtab FROM TABLE itab ACCEPTING DUPLICATE KEYS.如果出現關鍵字字相同條目,SY-SUBRC返回4,並跳過該條目,並更新其它條目.
6.4.2 UPDATE語句
l UPDATE dbtab SET f1 = g1 ... fn = gn WHERE
l UPDATE dbtab FROM wa.根據工作區中的關鍵字更新對應的條目.
l UPDATE dbtab FROM TABLE itab.根據內表關鍵字批量更新數據.
6.4.3 MODIFY語句
l MODIFY dbtab FROM wa.添加或更新單行.
l MODIFY dbtab FROM TABLE itab.添加或更新多行.
6.4.5 DELETE語句
l DELETE FROM dbtab WHERE
l DELETE dbtab FROM wa.
l DELETE dbtab [CLIENT SPECIFIED] FROM TABLE itab.如果有一行不能刪除,系統繼續處理下一行,成功刪除內表中所有行時,SY-SUBRC返回0.如果內表為空,會刪除所有數據,且SY-SUBRC和SY-DBCNT都返回0.
6.5數據一致性
6.5.1 SAP LUW與DB LUW
1.LUW概念:在SAP系統中,兩個數據一致狀態中的時間間隔為LUW(Logical Unit of Work),每一個LUW都需要以一個提交(COMMIT)或者返回(ROLLBACK)作為結束標志.如果以提交操作結束則進行所有更新操作,而返回操作則取消所有數據庫表的更改.
2.數據庫LUW:這是底層數據庫自身提供的保持數據一致性的機制,與SAP系統無關,對於ABAP程序來說,主要的問題在於如何確定數據庫的LUW的觸發時機,一個工作過程總是在下述情況下結束一個數據庫LUW並隱式地進行數據庫提交:
l 當一個對話步驟(Dialog step)結束,即顯示一個新屏幕給用戶時.
l 在另一個工作過程繼續程序的執行,這一般出現在RFC(遠程功能模塊)的調用或返回過程中.
相應地,下列情況將使數據庫隱式地進行返回操作:
l 當前ABAP程序出現運行錯誤.
l 一個ABAP程序因類型A或X的消息而導致中止.
3.SAP LUW:一個SAP LUW可以包含多個對話步驟,即多個數據庫LUW,但一個OPEN SQL語句不能被分隔為幾個對話步驟,即通過SAP LUW可以將多個數據庫LUW進行捆綁,並保存整體初始狀態,不進行真正的數據庫修改,當SAP LUW中的最后一個數據庫LUW結束時,再進行整體修改,或者整體取消操作.
SAP LUW提供兩種具體數據庫LUW捆綁機制:
l 在定義FUNCTION時將其定義為Update module,同時在調用時用如下方式:CALL FUNCTION ...IN UPDATE TASK.則該模塊不是馬上被執行,而是被放置於應用服務器中的一個特殊的更新工作過程(Update work process)中,因此可以將多個分布在不同對話過程中的類似模塊捆扎在一起,當SAP LUW結束時,確保所有模塊被同時成功執行或整體放棄,因此可通過該方式封裝分布在不同對話過程中的所有數據庫更新操作.一個SAP LUW顯式提交方式:COMMIT WORT [AND WAIT].該語句結束SAP LUW並觸發更新工作過程,該過程在同一個數據庫LUW中進行更新操作,因而數據庫LUW此時可以替代SAP開始進行一致性控制.這些進行更新工作的FUNCTION可以被設為同步(加AND WAIT)或異步模式.即是否要等到更新任務完成后才繼續執行后續語句.
l PERFORM ... ON COMMIT [LEVEL n].效果與上面相同,此方法更高效,但此時子程序不能傳遞參數. LEVEL表示優先級,n取整數.n越小越先執行.
l ROLLBACK WORK.控制SAP LUW整體返回,在實現SAP LUW更新功能的FUNCTION或子程序內部不能使用此語句及COMMIT語句.
TABLES SPFLI.
DATA FLAG.
SPFLI-CARRID = 'LH'. SPFLI-CONNID = '1245'.
SPFLI-CITYFROM = ............
INSERT SPFLI.
IF SY-SUBRC <> 0.
FLAG = 'X'.
ENDIF.
SPFLI-CARRID = 'AA'. SPFLI-CONNID = '4574'.
SPFLI-CITYFROM = ............
INSERT SPFLI.
IF SY-SUBRC <> 0.
FLAG = 'X'.
ENDIF.
................
IF FLAG = 'X'.
ROLLBACK WORK.
ELSE.
COMMIT WORK.
ENDIF.
6.5.2 SAP數據鎖定
用SE11創建一個鎖定對象(lock object).激活它時會自動同時生成兩個FUNCTION:ENQUEUE_
l 共享锁定(shared):该模式允许 多个用户访问指定表行,但只能读访问.任何时候都不允许写访问。
l 排他锁定(exclusive,not cumulative):该模式允许单个用户对指定表行进行读和写访问。其它用户不能访问该行。
l 扩展排他锁定(exclusive,cumulative): 该模式避免具有读写访问权限的单个用户获得对相同表行集的进一步锁定。当使用递归例程更新时,该模式很有用。
激活锁定对象导致系统生成用于锁定和解锁对象的特殊功能模块。这些功能模块称为:
调用 ENQUEUE/DEQUEUE 功能模块
ENQUEUE_
运行时,在试图读或写之前可以锁定该数据库对象。要锁定对象,请在第一屏幕的PAI事件中调用功能模块ENQUEUE_
ENQUEUE/DEQUEUE参数
ENQUEUE/DEQUEUE功能模块有下列参数集:
?arg和x_arg(ENQUEUE和DEQUEUE)
这两个EXPORTING参数,存在于锁定参数的每个字段arg中。将arg设置为所需的关键字字段值。如果该字段不需要特殊值,则忽略arg参数,或者将其设置为字段的初始值。如果要将字段的初始值作为实际选择值,请将x_arg设置为‘X’。
?_SCOPE(ENQUEUE)
如果事务不调用更新任务功能,则只在对话任务中更新。应该使用相应的DEQUEUE功能直接释放锁定。
如果调用任意的V1更新任务功能,请设置参数_SCOPE以告知系统应该如何释放SAP锁定。可能的值为:
1该值用于创建更新任务中不需要的锁定。在整个对话任务处理中保持使用_SCOPE=1设置的锁定,但该锁定并不能用于任意的更新任务请求。要保证不将锁定保持超过必要的时间,在事务结束时应该直接释放它(通过相应的DEQUEUE功能)。
在ROLLBACKWORK时释放:系统不释放使用_SCOPE=1设置的锁定。在编制反转程序时,请使用DEQUEUE功能。
2该值用于创建下列锁定:
-在更新任务触发之前在对话任务中使用
-一旦已经触发了更新任务,则只在更新任务中使用。
这意味着在COMMITWORK已经触发更新任务之后,如果该任务继续运行,则锁定不再可用于对话任务事务。系统在V1更新任务处理结束之后(或者在下一ROLLBACKWORK)释放锁定。
如果不指定_SCOPE,该值就是缺省值。不需要将DEQUEUE用于使用_SCOPE值创建的锁定。但是,如果_SCOPE=2,并且不调用更新任务功能,则不触发更新任务而且系统不释放锁定。
在ROLLBACKWORK释放:如果在提交前发生反转,则系统释放使用_SCOPE=2设置的锁定。在提交之后,锁定保持到更新任务处理结束。
3使用该值创建以下锁定:
-在触发更新任务之前在对话任务中使用
-在触发更新任务之后,由对话任务和更新任务使用。
也就是说,对话任务程序继续使用该锁定,甚至该更新任务功能正在运行时也是如此。在这种情况下,锁定由对话事务和更新任务功能所“共有”。
在V1更新任务处理之后的某个时刻系统释放锁定。但是,应该直接释放锁定(通过相应的DEQUEUE函数)以确保尽可能早地释放。
在ROLLBACKWORK释放:一旦已经触发更新任务,则使用_SCOPE=3设置的锁定有两个独立的所有者。要删除锁定,必须在对话任务和更新任务两方同时删除此锁定。如果在提交前发生反转,则在更新任务方释放锁定,但是对话任务方仍然保留它。如果在提交后发生反转,则系统在双方都不释放该锁定。在这种情况下,必须使用DEQUEUE功能在对话方直接释放该锁定。更新任务方将自动释放锁定。
如果用户在事务完成前已经退出了该事务(例如通过“/n”)或者程序异常终止,则系统释放所有锁定。V2功能也不能继承对话任务所创建的锁定。
?_WAIT(只ENQUEUE)
此EXPORTING参数告知:如果即将锁定的对象已经由其它用户锁定,ENQUEUE是否应该等待。如果要等待则将_WAIT设置为'X'。在这种情况下,系统试图以指定时间长度的重复间隔锁定该对象。如果这些尝试失败,则ENQUEUE导致FOREIGN_LOCK例外。
如果程序不想等待,则将_WAIT设置为其它任何值。在这种情况下,ENQUEUE导致FOREIGN_LOCK例外,并且将系统字段SY-MSGV1设置为已经拥有该锁定的用户名。
ENQUEUE例外
在调用ENQUEUE功能模块之后,应该检查在程序中该对象是否已经锁定。在功能模块中定义了下列例外:
?FOREIGN_LOCK
其它用户已经锁定了对象。系统字段SY-MSGV1包含该用户名。
?SYSTEM_FAILURE
一般系统错误。
6.5.3用戶權限檢查
(1)事務運行權限
(2)程序運行權限
(3)程序內部權限檢查
首先用T-CODE:SU21創建授權對象.
AUTHORITY-CHECK OBJECT ‘object’
ID ‘field_name1’ FIELD f1
ID ‘field_name2’ FIELD f2|ID ‘field_name’ DUMMY
6.6其它數據操作形式
6.6.1文件接口
l 創建邏輯文件名及路徑名(解決平台相關性問題):FILE.
l 獵取當前平台可識別的文件名:FILE_GET_NAME
(1)處理應用服務器文件
1.打開文件:OPEN DATASET dsn
l FOR INPUT:讀取方式,如果文件不存在則忽略此命令.如果文件己打開,操作指針將復位到文件的起始位置.
l FOR OUTPUT:寫入方式,如果文件不存在則創建文件,如果文件存在但處于關閉狀態則刪除其內容,如果文件存在且己打開,指針復位.
l FOR APPEND:附加方式,如果文件不存在則創建文件,如果文件存在則打開文件同時將指針定位到文件末尾,SY-SUBRC總是返回0.
l FOR TEXT MODE:文本模式,讀取或寫入數據時,數據逐行傳輸,系統假定文件具有行結構,如果要將字符串寫入文件或己知現有文件是基于行結構的格式,則應用使用此模式.
l FOR BIANARY MODE:二進制模式,讀取或寫入數據時系統逐字節地傳輸數據,傳輸期間系統不解釋文件內容,在將某文件內容寫入到另一文件時,系統將傳輸源文件的所有字節,在從文件讀取到字段時,傳輸的字節數取決於目標字段的大小.
l FOR POSITION pos:打開文件並將讀寫數據操作指針定位於位置pos,該位置從文件起始處按字節計算.
l MESSAGE msg:系統將在變量msg中放置相關操作系統消息.要進行錯誤處理,應與通過該選項和系統字段SY-SUBRC返回值一起接收完整的錯誤消息.
l FILITER filt:該選項與操作系統相關,對于UNIX或者NT系統,可以通過將系統指令置於filt中執行.如在讀取之前將文件用windows指令解壓縮.
2.關閉文件:CLOSE DATASET dsn.只有在寫入文件前要刪除當前文件內容時,才有必要關閉文件.
3.刪除文件:DELETE DATASET dsn.刪除成功SY-SUBRC返回0,否則返回4.
4.TRANSFER f TO dsn [LENGTH len].將數據對象f的值寫入文件dsn.字段f可以是基本數據類型,或者不包含作為內表組件的結構體,文件寫入模式由OPEN DATASET語句在打開時指定的,如果沒有打開,系統將嘗試用二進制方式打開,或使用上一個OPEN DATASET語句的模式,LENGTH指定傳輸數據的長度,如果f的長度大于len則截斷,否則填充空格,如果文件以文本模式打開,則每個TRASFER語句中,系統向文件中傳輸除結尾空格之外的所有字節,並在其后作結束標記.
5.從文件中讀取數據:READ DATASET dsn INTO f [LENGTH len].在讀取前應用OPEN DATASET語句指定傳輸模式,讀取成功SY-SUBRC返回0,讀到文件末尾返回4,不能打開時返回8,如文件以二進制模式打開,可用LENGTH指定傳輸長度,如文件以文本模式打開,則每個READ DATASET語句中,系統將讀取下一個行結束標記之前的所有數據.
REPORT z_file_test .
PARAMETERS file(30) TYPE c DEFAULT '/tmp/myfile'.
DATA:wa_sflight TYPE sflight,
sflight_tab_1 LIKE TABLE OF wa_sflight,
sflight_tab_2 LIKE TABLE OF wa_sflight.
OPEN DATASET file FOR OUTPUT IN BINARY MODE.
SELECT * FROM sflight INTO wa_sflight.
TRANSFER wa_sflight TO file.
APPEND wa_sflight TO sflight_tab_1.
ENDSELECT.
CLOSE DATASET file.
OPEN DATASET file FOR INPUT IN BINARY MODE.
DO.
READ DATASET file INTO wa_sflight.
IF sy-subrc <> 0.
EXIT.
ENDIF.
APPEND wa_sflight TO sflight_tab_2.
ENDDO.
CLOSE DATASET file.
IF sflight_tab_1 = sflight_tab_2.
MESSAGE i888(sabapdocu) WITH 'OK'.
ENDIF.
該程序在應用服務器的/tmp目錄中創建了一個文件myfile存儲程序內表中的數據,SAP應用服務器文件及目錄可以通過事務AL11(SAP Directories)進行瀏覽.
(2)處理展示服務器文件(用戶端本機)
1. 下載文件到本機FUNCTION:DOWNLOAD或WS_DOWNLOAD,其中DOWNLOAD在下載時會顯示用戶對話框.
2. 上傳文件到程序FUNCTION:UPLOAD或WS_UPLOAD,其中UPLOAD在文件上傳時會顯示用戶對話框.
3. 獲取展示服務器上文件和操作系統信息FUNCTION:WS_QUERY.
6.6.2數據簇操作
(1)ABAP/4內存中的數據簇
1.在 ABAP/4 内存中存储数据对象
EXPORT
此语句将列表中指定的数据对象存储为ABAP/4内存中的数据簇。如果忽略选项FROM
注:ID
2. 从内存中读取数据对象
IMPORT
此语句从ABAP/4内存的数据簇中读取列表中指定的数据对象。如果忽略选项TO
不必读取存储在特定ID
此语句不进行这种检查:即内存中的对象结构与要写入的结构是否匹配。因为数据是按位进行传送的,所以不匹配的结构可能会引起不一致。
3.删除内存中的数据簇
FREE MEMORY [ID
(2)數據庫中的數據簇
1.簇數據庫的結構:
建立簇数据库的规则如下所述。必须创建第一点到第四点中列出的关键字段。上述数据类型都是ABAP/4词典类型。
1.如果该表是针对客户的,第一个字段必须这样定义:名称为MANDT,类型为CHAR,长度为3字节,用于存储客户ID。存储数据簇时,系统既可自动使用当前客户填写字段MANDT,还可使用EXPORT语句中显式指定的客户进行填写。2.下一字段(对于与客户无关的表,这是第一个字段)必须这样定义:名称为RELID,类型为CHAR,长度为2字节。该字段包含区域ID。簇数据库被分成不同的区域。存储数据簇时,系统用EXPORT语句中指定的区域ID填写字段RELID。3.下一字段类型为CHAR,长度可变。它包含簇的名称
4.下一字段必须名称为SRTF2,类型为INT4,长度为4。单个数据簇可以扩展到数据库表的好几行中。在理论上,每个簇可能有2**31行。字段SRTF2包含存储的数据簇内行的顺序号码,可以是0和2**31-1之间的任何值。存储数据簇时,系统自动填写此字段(参见第7点)。
5.SRTF2的后面可以是任何数目的数据字段,这些字段名称和类型可任意交换。存储数据簇时,系统并不自动填写这些字段。必须在程序中的EXPORT语句之前将值显式分配到这些字段。通常包含诸如程序名、用户ID等控制信息。
6.行上的倒数第二个字段名称必须为CLUSTR,类型为INT2,并且长度必须为2。它包含后面的字段CLUSTD中的数据长度。存储数据簇时,系统自动填写此字段。
7.行上的最后一个字段必须名称为CLUSTD,类型为VARC。其长度可以任意,但通常为1000个字节左右。存储数据簇时,系统按压缩格式用实际数据填写此字段。如果CLUSTD的长度不足以存储簇数据,则数据就被分布到多行上。这些行在字段SRTF2中进行编号(参见上面的第4点)。
既可以按照上述规则创建自己的簇数据库(此时参见文档ABAP/4词典),也可以使用系统定义的簇数据库INDX
(2)在簇数据库中存储数据对象
EXPORT
TO DATABASE
此语句将列表中指定的数据对象存储为簇数据库
l
l
l 在处理特定客户的簇数据库时可以使用选项CLIENT
l EXPORT语句也将表工作区
在具有相同名称
(3)创建数据簇目录表
IMPORT DIRECTORY INTO
FROM DATABASE
[CLIENT
此语句在存储于数据库
IMPORT语句也自动从数据库表中读取表工作区
(4)从簇数据库中读取数据对象
IMPORT
FROM DATABASE
[CLIENT
此语句从数据库
不必读取存储在特殊名称
运行时,系统检查此语句以查看数据库中对象的结构是否与要写入的结构相符。如果不符合,将出现运行时间错误。类型C字段是此规则的例外,也可显示在结构数据字段结尾。可以加长、缩短、附加或忽略。
(5)从簇数据库中删除数据簇
DELETE FROM DATABASE
此语句删除数据库表