ILE RPGにSQLを埋め込む


前の训练の时、佳姉はRPGの中でSQL言语を埋め込むことを提案して、その时RPGプログラムの中で1つのクエリーの文を书いてみて、コンパイルはいつも通じません;
知識が限られているので、その時も置いてありました.
大学で「データベースシステムの概念」という授業を勉強していたとき、SQLに埋め込まれた点を理解しましたが、いくつかの理論の規範と文法に限られています.
今週はずっとRPGにSQLが埋め込まれているものを見ていて、少し基礎ができたので、昨日の午後に書いてみましたが、DB 2や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
i 5/OSの物理ファイルはDB 2の中のテーブルに対応しており、SQLクエリではテーブルの概念で物理ファイルを処理することもできます.
機能実装:カーソルを使用して、データをクエリーし、その後、ループを使用してカーソルからデータを読み出し、物理ファイルに書き込み、1つずつ書き込みます.
コードは次のとおりです.
     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)は1つしかありません.
2.カーソルが開いたら、閉じてください.
3.カーソル内のデータをループして読み取る方法の1つ: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-