rpgle中引用完整性的兑现

rpgle中引用完整性的实现

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--