在进行业务开发过程中根据科室提出需求退休人员信息表中新增一个信息完整度的概念(新增一个字段存完整度信息),通过完整度确认是否进行资金发放等相关业务,起初想到在存库之前通过后台业务逻辑实现完整度的计算一并存入数据库的方式实现,最后发现不是一个好的实现方式,本文通过Oracle的触发器实现 信息完整度的自动计算以及实现存库。
本文没有使用业务的代码,建立了测试表进行模拟,建表语句如下:
【注】 建表语句 表空间部分也可以不添加。
-- Create table
create table T_TEST
(
id VARCHAR2(32) not null,
name VARCHAR2(30),
sex VARCHAR2(5),
age NUMBER(3),
address VARCHAR2(200),
idcard VARCHAR2(20),
phone VARCHAR2(20),
integrity NUMBER(3)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
-- Add comments to the columns
comment on column T_TEST.name
is '姓名';
comment on column T_TEST.sex
is '性别';
comment on column T_TEST.age
is '年龄';
comment on column T_TEST.address
is '地址';
comment on column T_TEST.idcard
is '身份证号';
comment on column T_TEST.phone
is '手机号码';
comment on column T_TEST.integrity
is '数据完整度(%)';
-- Create/Recreate primary, unique and foreign key constraints
alter table T_TEST
add primary key (ID)
using index
tablespace USERS
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
可以根据字段分配不同的比重,对表数据新增或者更新操作会触发触发器的执行,自动计算数据信息完整度(%)。
CREATE OR REPLACE TRIGGER TRIG_INTEGRITY_T_TEST
before insert or update on T_TEST
for each row
DECLARE
-- 完整度(%)
INTEGRITY_ T_TEST.INTEGRITY%TYPE;
BEGIN
INTEGRITY_ :=0;
-- 姓名 比重占20分
IF :new.NAME IS NOT NULL THEN
BEGIN
INTEGRITY_ := INTEGRITY_ + 20;
END;
ELSE
NULL;
END IF;
-- 身份证号 比重占25分
IF :new.IDCARD IS NOT NULL THEN
BEGIN
INTEGRITY_ := INTEGRITY_ + 25;
END;
ELSE
NULL;
END IF;
-- 手机号码 比重占25分
IF :new.PHONE IS NOT NULL THEN
BEGIN
INTEGRITY_ := INTEGRITY_ + 25;
END;
ELSE
NULL;
END IF;
-- 地址 比重占20分
IF :new.ADDRESS IS NOT NULL THEN
BEGIN
INTEGRITY_ := INTEGRITY_ + 20;
END;
ELSE
NULL;
END IF;
-- 性别 比重占5分
IF :new.SEX IS NOT NULL THEN
BEGIN
INTEGRITY_ := INTEGRITY_ + 5;
END;
ELSE
NULL;
END IF;
-- 年龄 比重占5分
IF :new.AGE IS NOT NULL THEN
BEGIN
INTEGRITY_ := INTEGRITY_ + 5;
END;
ELSE
NULL;
END IF;
:new.INTEGRITY := INTEGRITY_;
END;
首先通过执行数据的新增操作,查看信息完整度的计算是否是预期之中。
INSERT into t_test (ID,NAME,SEX,AGE,ADDRESS,IDCARD,PHONE)
values ('123',null,'男',null,'测试地址','411322199405064231','15298988888');
INSERT into t_test (ID,NAME,SEX,AGE,ADDRESS,IDCARD,PHONE)
values ('456','李四','男',null,'测试地址',null,'15298988888');
INSERT into t_test (ID,NAME,SEX,AGE,ADDRESS,IDCARD,PHONE)
values ('789','王五','男',25,'测试地址','411322199405064231','15298988888');
select * from t_test ;
update t_test set name ='周六' where id = '123';
update t_test set age= 30 where id = '456';
select * from t_test ;