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

8 篇文章 0 订阅

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

新增预期结果显示
再执行数据更新操作,查看是否计算结果是否预期结果。

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

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

select * from t_test ;

编辑预期结果显示
至此触发器实现数据记录新增/更新时自动计算信息完整度已实现。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值