Oracle触发器实现新增/更新一条数据记录时同时更新某个字段信息(计算信息完整度)

在进行业务开发过程中根据科室提出需求退休人员信息表中新增一个信息完整度的概念(新增一个字段存完整度信息),通过完整度确认是否进行资金发放等相关业务,起初想到在存库之前通过后台业务逻辑实现完整度的计算一并存入数据库的方式实现,最后发现不是一个好的实现方式,本文通过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;

测试SQL

首先通过执行数据的新增操作,查看信息完整度的计算是否是预期之中。

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 ;

Oracle触发器实现新增/更新一条数据记录时同时更新某个字段信息(计算信息完整度)_第1张图片
再执行数据更新操作,查看是否计算结果是否预期结果。

update t_test set name ='周六' where id = '123';

update t_test set age= 30 where id = '456';

select * from t_test ;

Oracle触发器实现新增/更新一条数据记录时同时更新某个字段信息(计算信息完整度)_第2张图片
至此触发器实现数据记录新增/更新时自动计算信息完整度已实现。

你可能感兴趣的:(SQL,Oracle,Oracle,SQL,触发器,信息完整度)