rpgle中引用完整性的实现

本文介绍了在RPGL编程中如何实现引用完整性,通过检查一个物理文件中的数据是否存在于另一个物理文件中来确保数据一致性。文章还展示了如何通过定义数据库表的主外键关系来自动维护这种完整性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

rpgle编程中,也经常会碰到这样的问题,向B物理文件中添加数据的时候,一定要先检查A物理文件中是否有其相关数据的存在;

若不存在,则不允许添加,若存在于A中,则可以向B物理文件中添加数据。这种检查操作,叫做引用完整性。

引用完整性可理解为一个表中的数据依赖于另外一个表,也就是子表中的数据依赖于父表中的数据而存在。

下面是用rpgle去实现引用完整性的代码片段:

     C     K_CDRD01      KLIST
     C                   KFLD                    I_ACTYP
     C                   KFLD                    I_ACTNO
      *------------------
      * @PROSR主处理
      *------------------
     C     @PRO          BEGSR
     C                   SELECT
      *新增
     C                   WHEN      I_FUNCFLG = '1'
      *CDTD01物理文件中未登记活动,无法进行此交易
     C     K_CDRD01      CHAIN     CDRD01
     C                   IF        NOT %FOUND
     C                   EVAL      REJMSGID = 'CDS9999'
     C                   EVAL      ADDMSG   = '活动未登记'
     C                   EXSR      #SNDREJ
     C*程序结束
     C                   ENDIF
      *
      *如果记录存在,则更新CDTD02物理文件
     C     K_CDRD01      CHAIN     CDRD02
     C                   IF        %FOUND
     C                   EXSR      #UPDATE
     C                   ELSE
     C                   EXSR      #INSERT
     C                   ENDIF
      *修改
     C                   WHEN      I_FUNCFLG = '2'
     C                   EXSR      #UPDATE
      *删除
     C                   WHEN      I_FUNCFLG = '4'
     C                   EXSR      #DELETE
     C                   ENDSL
     C                   ENDSR
上面这段代码中,CDTD02物理文件中的数据依赖于CDTD01物理文件;

在向CDTD02物理文件中写数据的时候,如果将要写的这条数据部存在于CDTD01物理文件中,则不允许添加数据。

(物理文件是sytem i上存放数据的文件,对应于DB2的表)

对于数据库表而言,这种检查,不需要使用程序去检查,只需要在定义表的时候定义主外键参照即可。

我们来看如下:

create table cdtd01(
	actype  char(3) not null,
	actno   char(4) not null,
	......,
	primary key (actype,actno)
)
create table cdtd02(
	actype  char(3) not null ,
	actno   char(4) not null,
	......,
	constraint fk_actype_no foreign key(actype,actno) references cdtd01(actype,actno)
)
这样定义之后,上面在程序中做检查的事情,我们就交给数据库管理器去做了;

如果你想添加一条未做登记的数据,那么数据库将会给你返回一个错误码,这样岂不美哉!

更多DB2表的定义,参照:create table

--the end--

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值