数据库中的数据簇

  • Post author:
  • Post category:其他





原文转载自:

http://jiahongguang12.blog.163.com/blog/static/3346657200710158133785/





数据库中的数据簇:


存储数据簇是专就abap/4而言,尽管也可以使用SQL语句访问簇数据库,


但是只有abap/4,


语句能够对已存储的数据簇结构进行解码;


Export to database 语句将数据对像存储到簇数据库中,


Import from database 语句为数据簇生成目录表,并从簇数据库中读取数据对像,


Delete from database 语句从簇数据库中删除数据簇


注:该方法允许 单步存储任 何具有深结 构的复杂数 据对象,而 不必将其调 整为关系数 据库的平面 结构。这样 ,在整个系 统中都可使 用该数据对 象,并且每 个用户都可 对其进行访 问。要使访 问成功,必 须知道存储 对象的数据 类型。


在簇数据库 中存储数据 ,对于支持 有关关系数 据库信息的 分析结果十 分有用。例 如,如果要 从所有分支 机构的人员 数据中生成 销售额最高 的客户清单 或者完整的 通讯录,就 可以编写 ABAP/4 程序,让程 序来解决此 类问题,并 将结果存储 为数据簇。 如果需要刷 新存储的数 据簇,可以 在后台定期 运行这些程 序。要使用 该结果,可 以使用只访 问该数据簇 的其他程序 。因为不必 在每次使用 结果时都访 问关系数据 库中的分布 式数据,并 且也不必每 次都重新生 成结果,所 以,此方法 可以很大程 度上减少系 统的响应时 间。


1.    簇数据库


簇数据库是abap/4词典中的特殊数据库,用于存储数据族,其行结构被划分为标准化的


开始区和一个用于存储数据的大的区域。


建立簇数据库的规则如下所述,必顺建第一点到第四点中列出的关键字段,


1. 如果 该表是针对 客户的,第 一个字段必 须这样定义 :名称为 MANDT, 类型为 CHAR, 长度为 3 字节,用于 存储客户 ID。存储 数据簇时, 系统既可自 动使用当前 客户填写字 段 MANDT, 还可使用 EXPORT 语句中显式 指定的客户 进行填写。


2.   下一 字段(对于 与客户无关 的表,这是 第一个字段 )必须这样 定义:名称 为 RELID, 类型为 CHAR, 长度为 2 字节。该字 段包含区域 ID。簇数 据库被分成 不同的区域 。存储数据 簇时,系统 用 EXPORT 语句中指定 的区域 ID 填写字段 RELID。


3.   下一 字段类型为 CHAR, 长度可变。 它包含簇的 名称 <key>, 存储数据簇 时,在程序 中用 EXPORT 语句的附加 ID 指定了该簇 。因为后面 的字段要对 齐,所以系 统应最多使 用 3 个未用字节 填充在字段 RELID 的结尾。如 果创建自己 的簇数据库 ,应该相应 地定义此字 段的长度。


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 中进行编号


簇数据库的示例:


数据库 INDX 是簇数据库 的示例,是 系统中所包 含的标准安 装的一部分 。从用户应 用的角度考 虑,由于没 有必要先创 建新的簇数 据库,所以 ,比较实用 。而且,所 有用户都可 以访问存储 在这里的数 据,并且还 可更改或删 除。


要在 ABAP/4 编辑器中查 看数据库 INDX 的结构,请 选择“编辑 -> 详细功能 -> 命令条目” ,然后输入 SHOW INDX, 或者双击 INDX, 例如在 TABLES 语句中。


对于每个字 段,都将看 到 ABAP/4 词典数据类 型和相应的 ABAP/4 编程语言的 数据类型( 也就是 TABLES 生成的表工 作区中的组 件数据类型 )。


头四个字段 是表 INDX 的关键字段 ,此 处簇名的第 三个字段的 名称是 SRTFD, 长度为 22 字节,也就 是说,对于 INDX, ABAP/4 程序中以 EXPORT 语句的附加 ID 指定的名称 <key> 最多可以有 22 个字符。


后七个字段 是非标准字 段,用于用 户输入,例 如:


_   AEDAT: 最后修改的 日期


_   USERA: 用户名


_   PGMID: 程序名


最后两个字 段也是预定 义的。在表 INDX 中,存储实 际数据簇的 字段 CLUSTD 的长度为 2886 个字节。


2.    在簇数据库中存储数据对像


在簇数据库中存储abap/4程序的数据据对像,


Export <f1>[from<g1>]<f2>[from<g2>]…..


To database<dbtab>(ar)[client<cli>] ID <key>.


注:此语句将列 表中指定的 数据对象存 储为簇数据 库 <dbtab> 中的簇。必 须用 TABLES 语句对 <dbtab> 加以声明。 如果不附加 FROM <gi>, 则将数据对 象 <fi> 存储在自己 的名称之下 。如果有附 件项,则将 数据对象 <gi> 存储到名称 <fi> 之下。


<ar> 是存储数据 库的簇的两 字符区域 ID。


<key> 标识数据库 中的数据, 其最大长度 取决于 <dbtab> 中名称字段 的长度。


在处理特定 客户的簇数 据库时可以 使用选项 CLIENT <cli> 关闭自动客 户处理,然 后自己指定 客户。必须 在指定数据 库名称之后 立即指定此 选项。


EXPORT 语句也将表 工作区 <dbtab> 的用户字段 内容传输到 数据库表。 根据需要, 可以预先填 写这些字段 。


在具有相同 名称 <key> 的相同工作 区 <ar> 和相同客户 系统 <cli> 中,EXPORT 语句总是完 全改写任何 现有数据簇 的内容。


示例:


PROGRAM SAPMZTS1.


TABLES INDX.


DATA: BEGIN OF ITAB OCCURS 100,


COL1 TYPE I,


COL2 TYPE I,


END OF ITAB.


DO 3000 TIMES.


ITAB-COL1 = SY-INDEX.


ITAB-COL2 = SY-INDEX ** 2.


APPEND ITAB.


ENDDO.


INDX-AEDAT = SY-DATUM.


INDX-USERA = SY-UNAME.


INDX-PGMID = SY-REPID.


EXPORT ITAB TO DATABASE INDX(HK) ID ‘Table’.


WRITE: ‘    SRTF2’,


AT 20 ‘AEDAT’,


AT 35 ‘USERA’,


AT 50 ‘PGMID’.


ULINE.


SELECT * FROM INDX WHERE RELID = ‘HK’


AND   SRTFD = ‘Table’.


WRITE: / INDX-SRTF2 UNDER ‘SRTF2’,


INDX-AEDAT UNDER ‘AEDAT’,


INDX-USERA UNDER ‘USERA’,


INDX-PGMID UNDER ‘PGMID’.


ENDSELECT.


因为 INDX 是关系数据 库,所以可 以使用开放 式 SQL 语句定位单 独行。使用 SELECT 语句,辅以 适当的 WHERE 条件就可选 择用 EXPORT 存储的行。


3.    创建数据簇目录表


从abap/4簇数据库中创建数据簇目录表,


IMPORT DIRECTORY INTO <dirtab>


FROM DATABASE <dbtab>(<ar>)


[CLIENT <cli>] ID <key>.


此语句在存 储于数据库 <dbtab> 中的数据簇 中创建一系 列数据对象 ,并将其放 到表 <dirtab> 中。必须使 用 TABLES 语句声明 <dbtab> 。


IMPORT 语句也自动 从数据库表 中读取表工 作区 <dbtab> 的用户字段 内容。


示例:


PROGRAM SAPMZTS2.


TABLES INDX.


DATA DIRTAB LIKE CDIR OCCURS 10 WITH HEADER LINE.


IMPORT DIRECTORY INTO DIRTAB FROM DATABASE


INDX(HK) ID ‘Table’.


IF SY-SUBRC = 0.


WRITE: / ‘AEDAT:’, INDX-AEDAT,


/ ‘USERA:’, INDX-USERA,


/ ‘PGMID:’, INDX-PGMID.


WRITE  / ‘Directory:’.


LOOP AT DIRTAB.


WRITE: / DIRTAB-NAME,  DIRTAB-OTYPE, DIRTAB-FTYPE,


DIRTAB-TFILL, DIRTAB-FLENG.


ENDLOOP.


ELSE.


WRITE ‘Not found’.


ENDIF.


此程序创建 数据簇的目 录表


内容 DIRTAB 的表含有一 行,该行表 明数据簇包 含名为 ITAB 的内表,表 具有 3000  个长度为 8 个字节的已 填写行。


4.    从数据库中读取数据对像


将数据对像从abap/4簇数据库读入abap/4程序中,


Import <f1>[to<g1>]<f2>[to<g2>]……


From database<dbtab>(ar)


[client<cli>] id<key>[mafor-id<maid>][minor-id<miid>].


此语句从数 据库 <dbtab> 中的数据簇 中读取列表 中指定的数 据对象。必 须用 TABLES 语句声明 <dbtab> 。如果不附 加 TO <gi>, 则将数据库 的数据对象 <fi> 分配给程序 中的同名数 据对象。如 果不附加此 选项,则将 数据库的数 据对象 <fi> 写入字段 <gi>。


<ar> 是即将存储 数据库的簇 的两字符区 域 ID。<key> 标识数据库 中的数据, 其最大长度 取决于 <dbtab> 中名称字段 的长度。可 以用 MAJOR-ID <maid> 代替附加 ID <key>。 然后,就选 定名称的第 一部分与 <maid> 相符的数据 簇。如果指 定具有 MAJOR-ID 的附加 MINOR-ID <miid>, 则选择名称 的第二部分 (也就是 <maid> 长度之后的 位置)大于 或等于 <miid> 的数据簇。 在处理特定 客户簇数据 库时,可以 使用选项 CLIENT <cli> 关闭自动客 户处理,然 后自己指定 客户。必须 在输入数据 库名之后立 即指定此选 项。


示例:


PROGRAM SAPMZTS3.


TABLES INDX.


DATA: BEGIN OF JTAB OCCURS 100,


COL1 TYPE I,


COL2 TYPE I,


END OF JTAB.


IMPORT ITAB TO JTAB FROM DATABASE INDX(HK) ID ‘Table’.


WRITE: / ‘AEDAT:’, INDX-AEDAT,


/ ‘USERA:’, INDX-USERA,


/ ‘PGMID:’, INDX-PGMID.


SKIP.


WRITE ‘JTAB:’.


LOOP AT JTAB FROM 1 TO 5.


WRITE: / JTAB-COL1, JTAB-COL2.


ENDLOOP.


此程序将内 表 JTAB中的示例程 序从 簇数据库 INDX 读入内表 JTAB。 INDX 的某些用户 字段输出和 JTAB 的头五行如 下所示:


5.从簇数据库中删除数据,


从簇数据库中删除数据簇,


DELETE FROM DATABASE <dbtab>(<ar>) [CLIENT <cli>] ID <key>.


此语句删除 数据库表 <dbtab> 中区域为 <ar> 和名称为 <key> 的整个数据 簇。必须用 TABLES 语句对 <dbtab> 进行声明。


处理特定 客户簇数据 库时,可以 使用选项 CLIENT <cli> 关闭自动客 户处理,然 后自己指定 客户。必须 在输入数据 库名称之后 立即指定此 选项。


示例:


PROGRAM SAPMZTS4.


TABLES INDX.


DATA DIRTAB LIKE CDIR OCCURS 10.


IMPORT DIRECTORY INTO DIRTAB FROM DATABASE


INDX(HK) ID ‘Table’.


WRITE: / ‘SY-SUBRC, IMPORT:’, SY-SUBRC.


DELETE FROM DATABASE INDX(HK) ID ‘Table’.


WRITE: / ‘SY-SUBRC, DELETE:’, SY-SUBRC.


IMPORT DIRECTORY INTO DIRTAB FROM DATABASE


INDX(HK) ID ‘Table’.


WRITE: / ‘SY-SUBRC, IMPORT:’, SY-SUBRC.


据簇。如果 启动程序时 存在数据簇 ,则输出如 下所示:


SY-SUBRC, IMPORT:     0


SY-SUBRC, DELETE:     0


SY-SUBRC, IMPORT:     4


在第一个 IMPORT 语句中,数 据簇依然存 在。然后成 功地执行 DELETE 语句。在第 二个 IMPORT 语句中,数 据簇不再存 在。


6.用开放式SQL访问数据库;


簇数据库是 在 ABAP/4 词典中定义 的关系数据 库,ABAP/4 以特殊方法 使用该词典


用 SELECT 语句读取字 段 CLUSTR 和 CLUSTID, 或用 UPDATE 语句对其进 行更改,都 毫无意义。 这些字段包 含由系统进 行编码的数 据簇,要对 其进行正确 的处理,只 能使用 EXPORT TO DATABASE 和 IMPORT FROM DATABASE 语句。


如果数据簇 语句的特定 组合导致超 时运行,则 只应使用开 放式 SQL 语句 UPDATE、MODIFY 和 DELETE。 一定不要在 数据簇中使 用开放式 SQL 语句 INSERT。


可以使用开 放式 SQL 语句维护簇 数据库。例 如,SELECT 语句允许从 簇数据库表 中查看特定 数


PROGRAM SAPMZTS5.


DATA COUNT TYPE I VALUE 0.


TABLES INDX.


SELECT * FROM INDX WHERE RELID = ‘HK’


AND   SRTF2 = 0


AND   USERA = SY-UNAME.


DELETE FROM DATABASE INDX(HK) ID INDX-SRTFD.


IF SY-SUBRC = 0.


COUNT = COUNT + 1.


ENDIF.


ENDSELECT.


WRITE: / COUNT, ‘Cluster(s) deleted’.


此示例程序 从表 INDX 中删除区域 “HK”( 其中的字段 USERA 包含当前程 序用户名称 )中的所有 数据簇。用 SELECT 语句填写表 工作区 INDX 的字段 SRTFD, 并在 DELETE 语句中使用 。在 WHERE 子句中指定 SRTF2 = 0,可以保 证只对每个 数据簇进行 一次处理。


PROGRAM SAPMZTS5.


TABLES INDX.


DATA DIRTAB LIKE CDIR OCCURS 10 WITH HEADER LINE.


UPDATE INDX SET RELID = ‘NW’


SRTFD = ‘Internal’


WHERE RELID = ‘HK’


AND   SRTFD = ‘Table’.


WRITE: / ‘UPDATE:’,


/ ‘SY-SUBRC:’, SY-SUBRC,


/ ‘SY-DBCNT:’, SY-DBCNT.


IMPORT DIRECTORY INTO DIRTAB FROM DATABASE


INDX(NW) ID ‘Internal’.


WRITE: / ‘IMPORT:’,


/ ‘SY-SUBRC:’, SY-SUBRC.


此程序更改 了使用

在簇数据库 中存储数据 对象

(页 7) 中的示例程 序存储的数 据簇。启动 程序时,如 果存在数据 簇,并且在 UPDATE 语句中没有 其他错误, 则输出如下 所示:


UPDATE:


SY-SUBRC:     0


SY-DBCNT:     6


IMPORT:


SY-SUBRC:     0


UPDATE 语句更改属 于指定数据 簇的数据库 表 INDX 的六行