ILE RPG中嵌入SQL

在之前培训的时候,佳姐提了点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-

你可能感兴趣的:(Math,sql,c,数据库,db2,disk)