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