RPG多文件读取转换为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.zzzyk.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.zzzyk.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.zzzyk.com
/END-FREE
C ENDSR
......
从上面这段RPG代码,就可以应证这一点:
“对于传统的数据记录的访问,程序员决定数据访问方法,应用的性能取决于程序员的编程技巧与经验”。
程序员必须清楚:
文件的遍历顺序?
用什么方式遍历?READE还是CHAIN?
没有丰富的经验和对RPG读取文件的操作码的足够认识,很可能就会遗漏掉文件中的部分数据,或者造成根本没有读取文件。
如果转换为SQL去访问表,我们就不用关心数据库中表的访问方式,只需要写出逻辑正确的SQL语句。 www.zzzyk
上一个:DB2解决“数据库日志已满”操作
下一个:db2中简单的DDL操作
- 更多SQLServer疑问解答:
- 配置MSSQL复制指定快照文件夹提示:不是有效的路径或文件名
- 详细解读varchar和Nvarchar区别
- SQL SERVER 2005 同步复制技术
- 进程未能大容量复制到表 解决方法
- MSSql实例教程:MSSql数据库同步
- SQLServer2000同步复制技术实现(分发和订阅)
- sqlserver
- SQLSERVER
- 测试 sqlserver 最大用户数连接
- 写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的
- sqlserver2008的安装问题。
- 为什么安装的SQL server 2008我的没有MSSQLSERVER协议啊?
- 怎样把exel表里的数据复制到sqlserver表里
- sqlserver数据库主键和外键问题
- sqlserver 中的左表连接查询和右表连接查询有啥不同?有什么用?