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