在AS400里面,数据存放在物理文件中,逻辑文件可以实现对数据的筛选,功能类似视图。
如果我们使用create view命令,在AS400里面建立视图,其本质上还是在创建逻辑文件,只不过这个过程有I5/OS完成。
当我们使用create index命令建立索引的时候,还是在创建逻辑文件,只不过这个逻辑文件有K值,这就是Keyed Logical File。
下面是一个对Keyed Logical File进行操作的RPGLE程序:
F*Function:操作带K的逻辑文件 FSTUFML UF E K DISK C*程序控制 C EXSR @MAIN C EXSR @EXIT C*主处理 C @MAIN BEGSR C*让游标指向过滤后的数据的前面 C*这里根据性别去查找,游标指向找到的一堆记录的前面 C* C*对于读取的数据,若记录当中没有K值,我们可以如下来顺序读取记录: C* 1 SETLL R_PF C*也可以不用设置游标,直接按记录的原始存储顺序读取 C* READ R_PF C *LOVAL SETLL RSTU C*使游标指向第一条数据 C READ RSTU C DOW NOT %EOF(STUFML) C*修改1990-01-01后出生的同学地址 C IF DOB > D'1990-01-01' C EVAL ADDR = 'GUANGZHOU' C UPDATE RSTU C ENDIF C*让游标指向下一条数据 C READ RSTU C ENDDO C ENDSR C*退出程序 C @EXIT BEGSR C EVAL *INLR='1' C RETURN C ENDSR程序主要是对性别为0(女)的学生进行更新操作,物理文件和逻辑文件如下:
DDS---STUDENT --------------------------------------------------------------------- A UNIQUE A R RSTU TEXT(' 学生信息 ') A SNO 8S COLHDG(' 学号 ') A SNAME 10A COLHDG(' 姓名 ') A SEX 1A COLHDG(' 性别 ') A VALUES('0' '1') A TEXT('0- 女 ,1- 男 ') A DOB L COLHDG(' 生日 ') A DATFMT(*ISO) A ADDR 15A COLHDG(' 地址 ') A K SNO -------------------------------------------------------------------- DDS---STUFML -------------------------------------------------------------------- A R RSTU PFILE(STUDENT) A K SEX A S SEX CMP(EQ '0') --------------------------------------------------------------------下面是原始数据:
SELECT * FROM STUDENT 学号 姓名 性别 生日 地址 10122111 SCOTT 1 12-01-85 GUANGZHOU 10123210 THOMAS 1 07-12-90 NEW YORK 10122230 ALICE 0 03-11-91 NEW YORK 10212101 ANGELIA 0 10-17-89 SHANGHAI 10122402 CHARLENE 0 11-12-89 BEIJING 10121122 ADAMS 1 01-01-92 HONGKONG 10122309 TONY 1 01-12-81 TAIWAN 10120013 CATHY 0 10-28-93 MACAO下面是逻辑文件筛选出来的数据:
SELECT * FROM STUFML 学号 姓名 性别 生日 地址 10122230 ALICE 0 03-11-91 NEW YORK 10212101 ANGELIA 0 10-17-89 SHANGHAI 10122402 CHARLENE 0 11-12-89 BEIJING 10120013 CATHY 0 10-28-93 MACAO在编译程序成功之后,CALL程序,再查询,结果如下:
学号 姓名 性别 生日 地址 10122230 ALICE 0 03-11-91 GUANGZHOU 10212101 ANGELIA 0 10-17-89 SHANGHAI 10122402 CHARLENE 0 11-12-89 BEIJING 10120013 CATHY 0 10-28-93 GUANGZHOU这里需要注意的地方是,此逻辑文件只是基于一个物理文件,当基于多个物理文件的时候(JFILE),情况就不是这样了。
逻辑文件STUFML只是对物理文件STUDENT的数据进行筛选,并拥有自己的键K,当我们修改逻辑文件所呈现的数据的时候,可以直接使用物理文件的字段,
因为本质上我们还是对逻辑文件基于的物理文件的数据进行修改。
逻辑文件STUFML的建立,可以转换为如下的 SQL语句:
CREATE INDEX IDXSEX ON STUDENT(SEX) WHERE SEX = '0'
当我们向数据库发出这样的语句:select * from student where sex = '0'时,索引就使用到了。
Keyed Logical File类似数据库中的Index,他们都能快速定位数据集,并找到指定数据。
下面是DB2 V9.7创建索引命令:
DB2 V9.7 Create index statement
下面是iSeries V5R4创建LF的命令:
iSeries v5r4 Create Logical File