在之前培训的时候,佳姐提了点RPG中嵌入SQL语言,当时试着在RPG程序里面写了一个查询语句,编译老是通不过;
由于知识有限,所以当时也就放着了。
在大学学习《数据库系统概念》这门课的时候,了解了点嵌入SQL,但只限于一些理论的规范和语法而已。
这周一直在看RPG中嵌入SQL的东西,有了一点基础,所以昨天下午试着去写了一个,用到了一些DB2和RPG相关知识。
边学边做,这个过程,确实有点漫长,有时候一个小毛病,就要花上很多时间去查找资料什么的,不过问题解决之后带个人的那种感觉,是相当好的。
下面是我的第一个ILE RPG中嵌入SQL的实例。
功能描述:读取三个物理文件(STUDENT,COURSE,ACHIVMENT),取出相应数据,让后存放到另外一个物理文件里面。
STUDENT(sno,sname,sex,dob,addr),COURSE(cno,cname),ACHIVMENT(sno,cno,achv);
ACHIVMENT通过sno,cno分别连接STUDENT,COURSE。
查询的数据:sname,cname,achv
i5/OS的物理文件对应DB2里面的表,我们也可以用表的概念来处理物理文件,在SQL查询中。
功能实现:使用游标,将数据查询出来,让后使用循环从游标中读取数据,并写入物理文件,每读取一条便写入一条。
代码如下:
FACHIVMENT IP E DISK FCOURSE IS E DISK FSTUDENT IS E DISK FSTAT UF A E DISK DCOL1 S 10A DCOL2 S 15A DCOL3 S 3S 0 D C*程序控制 C EXSR @MAIN C EXSR @EXIT C*主控制 C @MAIN BEGSR C*定义游标 C/EXEC SQL C+ DECLARE C1 CURSOR FOR C+ SELECT S.SNAME,C.CNAME,A.ACHV C+ FROM ACHIVMENT A,COURSE C,STUDENT S C+ WHERE A.CNO = C.CNO C+ AND A.SNO = S.SNO C/END-EXEC C*打开游标 C/EXEC SQL OPEN C1 C/END-EXEC C C/EXEC SQL WHENEVER NOT FOUND GO TO DONE1 C/END-EXEC C*循环读取游标里面的数据 C*SQLCOD = 0表示游标里面没有数据 C SQLCOD DOUNE 0 C C/EXEC SQL C+ FETCH C1 INTO :COL1,:COL2,:COL3 C/END-EXEC C*将数据写入到STAT物理文件中 C EVAL SNAME = COL1 C EVAL CNAME = COL2 C EVAL ACHV = COL3 C WRITE RSTAT C END C*关闭游标 C DONE1 TAG C/EXEC SQL CLOSE C1 C/END-EXEC C ENDSR C*程序结束 C @EXIT BEGSR C EVAL *INLR = '1' C RETURN C ENDSR注意:
1.嵌入SQL中,只能有一个主文件(P)。
2.游标打开之后,记得关闭。
3.循环读取游标里面的数据的方法之一:DOUNE操作码。
4.嵌入SQL代码一定要写在/EXEC SQL 和/END-EXEC之间。
附录:三个物理文件的数据,和编译程序(CRTSQLRPGI)成功之后,CALL程序的结果:
SELECT * FROM STUDENT Line ....+....1....+....2....+....3....+....4....+....5....+....6 学号 姓名 性别 生日 地址 000001 10,122,111 SCOTT 1 1985-12-01 GUANGZHOU 000002 10,123,210 THOMAS 1 1990-07-12 NEW YORK 000003 10,122,230 ALICE 0 1991-03-11 GUANGZHOU 000004 10,212,101 ANGELIA 0 1989-10-17 SHANGHAI 000005 10,122,402 CHARLENE 0 1989-11-12 BEIJING 000006 10,121,122 ADAMS 1 1992-01-01 HONGKONG 000007 10,122,309 TONY 1 1981-01-12 TAIWAN 000008 10,120,013 CATHY 0 1993-10-28 GUANGZHOU ----------------------------------------------------------------------- SELECT * FROM COURSE Line ....+....1....+....2.... 编号 名称 000001 10,001 CHINESE 000002 10,002 ENGLISH 000003 10,003 MATH 000004 10,004 PHYSICS 000005 10,005 HISTORY ----------------------------------- SELECT * FROM ACHIVMENT Line ....+....1....+....2....+.... 学号 课程号 成绩 000001 10,122,111 10,001 76 000002 10,212,101 10,005 100 000003 10,120,013 10,002 98 000004 10,123,210 10,003 100 000005 10,122,402 10,001 88 ---------------------------------------- SELECT * FROM STAT Line ....+....1....+....2....+....3....+ 姓名 课程 成绩 000001 SCOTT CHINESE 76 000002 ANGELIA HISTORY 100 000003 CATHY ENGLISH 98 000004 THOMAS MATH 100 000005 CHARLENE CHINESE 88
-the end-