RPG多文件读取转换为SQL多表查询

页面导航:首页 > 数据库 > DB2 > RPG多文件读取转换为SQL多表查询

RPG多文件读取转换为SQL多表查询

来源: 作者: 时间:2016-01-23 11:15 【

RPG多文件读取转换为SQL多表查询对于400上的应用,还大多停留在RPG,C,COBOL,或者Java操作文件的阶段。IBM的战略是将这些对物理或者逻辑文件的操作,向SQL过渡并迁移;通过SQL对数据集进

RPG多文件读取转换为SQL多表查询
 
对于400上的应用,还大多停留在RPG,C,COBOL,或者Java操作文件的阶段。
IBM的战略是将这些对物理或者逻辑文件的操作,向SQL过渡并迁移;通过SQL对数据集进行操作,而非访问文件记录;
传统的应用是对记录进行访问和操作,程序员决定了数据访问的方法,这样就致使应用性能的好坏取决于程序员的技巧和经验;
 
而SQL方式操作以数据为中心,DB2提供更多的数据访问方法,DB2可以选择最优的访问方法组合,让DB2为我们做复杂的数据访问优化。
下面是一段RPG程序片段,主要完成对2个视图和1个表函数返回值的处理,然后取到数据:
以变量P_SYSID所带的值为查询条件,遍历PMFM202视图(PMRM202为PMFM202逻辑文件的记录名);
对于读取到的每一条记录,都进行如下操作:
1.字段P20PCOD未出现在PMFM203视图里面。
2.调用函数GETATRVAL(可视为SQL表函数,返回PMFM20和PMFM21表中的相关数据),取每一个P20PCOD对应的数据。
 
3.将从表函数返回的数据与程序入口结构(DPM1000:P_SYSID,P_CCY,P_CPFLG)中数据进行比较。
[sql] 
......  
C     P_SYSID       SETLL     PMRM202  
C                   DOW       1=1  
C     P_SYSID       READE     PMRM202  
C                   IF        %EOF  
C                   LEAVE  
C                   ENDIF  
 *无效  
C                   IF        P20EFCT = '0'  
C                   ITER    www.2cto.com  
C                   ENDIF  
 *非末级产品  
C     P20PCOD       CHAIN     PMRM203  
C                   IF        %FOUND  
C                   ITER  
C                   ENDIF  
C  
 *取产品属性  
C                   EXSR      @PRDATR  
C*开办日期  
C                   IF        VYCMIDTE < K_OPNDAT  
C                   ITER  
C                   ENDIF  
C*停办日期  
C                   IF        VYCMIDTE > K_ENDDAT  
C                   ITER  
C                   ENDIF  
C*有效状态  
C                   IF        K_VLDSTS <> '1'  
C                   ITER  
C                   ENDIF  
C*单位个人标志  
C                   IF        P_CPFLG <> '' AND P_CPFLG <> K_CORPPSNFLG  
C                   ITER  
C                   ENDIF    www.2cto.com  
C  
C                   EVAL      O01_PCOD = P20PCOD  
C                   EVAL      O01_DESP = K_PRDNAM  
C  
C                   IF        O01_DESP = ''  
C                   EVAL      O01_DESP = P20DESP  
C                   ENDIF                                 
C  
C                   ADD       1             V_CNT  
C*生成下传信息  
C                   MOVEL(P)  PM1000C01O    MSGTXT  
C*控制前台应答响应  
C                   EVAL      FORMAT=VYCMTCDE+'01'  
C                   EXSR      #SNDQRY  
C  
C                   ENDDO  
......  
C     @PRDATR       BEGSR  
C*函数GETATRVAL的作用是用过参数P20PCOD,  
C*读取PMFM20表,和PMFM21表,然后取出相关数据,这里可以看作:  
 
C*表函数getatrval从通过传入参数,取PMFM20表和PMFM21表里面的相关数据。  
 /FREE  
        K_CORPPSNFLG = %TRIM(GETATRVAL(P20PCOD:'CORPPSNFLG'));  
        K_PRDNAM   = GETATRVAL(P20PCOD:'PRDNAM');               
        K_VLDSTS   = GETATRVAL(P20PCOD:'VLDSTS');               
        K_OPNDAT   = %DATE(GETATRVAL(P20PCOD:'OPNDAT'));        
        K_ENDDAT   = %DATE(GETATRVAL(P20PCOD:'ENDDAT'));        
        K_OPNORGLVL= GETATRVAL(P20PCOD:'OPNORGLVL');            
        K_OPNORGTYP= GETATRVAL(P20PCOD:'OPNORGTYP');            
        K_OPNTLRLVL= GETATRVAL(P20PCOD:'OPNTLRLVL');            
        K_OPNTLRTYP= GETATRVAL(P20PCOD:'OPNTLRTYP');                                    www.2cto.com                    
 /END-FREE  
C                   ENDSR  
......  
从上面这段RPG代码,就可以应证这一点:
“对于传统的数据记录的访问,程序员决定数据访问方法,应用的性能取决于程序员的编程技巧与经验”。
 
程序员必须清楚:
文件的遍历顺序?
用什么方式遍历?READE还是CHAIN?
没有丰富的经验和对RPG读取文件的操作码的足够认识,很可能就会遗漏掉文件中的部分数据,或者造成根本没有读取文件。
如果转换为SQL去访问表,我们就不用关心中表的访问方式,只需要写出逻辑正确的SQL语句。  www.2cto.com  
上面的这段代码转换为 SQL查询语句,可以书写如下:
[sql] 
select  a.p20pcod O01_PCOD  
       ,IFNULL(c.P21DESP,b.P20DESP) O01_DESP  
 from pmfm202 a,pmfm203 b,TABLE(GETATRVAL(b.p20pcod)) c  
where b.p20biz = a.p20biz  
  and b.p20pcod = c.p21pcod  
  and a.P20BIZ = P_SYSID  
  and a.P20EFCT <> '0'  
  and c.P21STRD <= CURRENT DATE  
  and c.P21ENDD >= CURRENT DATE  
  and TRIM(c.P21VAL) = P_CPFLG  
Tags:

文章评论

最 近 更 新
热 点 排 行
Js与CSS工具
代码转换工具

<