通过触发器截取插入Oracle的数据长度

本文介绍在Oracle数据库中,因xh_bookcard表中customer_id参与结算的表最大为10位,而查询表支持15位,为解决数据插入问题,使用触发器将插入的数据实时截断。文中给出创建表和触发器的代码,还介绍了触发器的使用、修改、删除及失效和生效操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前一段时间做一批书卡,书卡有卡面数字和磁条号码组成,其中卡面数字即印制在卡片上的字符,磁条号码就是在刷卡机上刷出来的数据,这个数据进入系统之后会生成一个用户编号,最终参与结算的是用户编号,在xh_bookcard查询customer_id是可以支持到15位的,但是其参与结算的某张表中customer_id最大为10位,如果直接导入会提示数据过大无法插入,这个时候就可以用触发器达到将插入的数据实时截断的目的(文中数据已做脱敏处理,无任何价值)

--创建书卡明细表、添加注释设置主键和约束条件

create table xh_bookcard

(

  card_id     varchar2(32) not null,

  customer_id varchar2(32) not null,

  no_id       varchar2(32) not null,

  memo        char(64)

) ;

comment on table xh_bookcard is '书卡明细表';

comment on column xh_bookcard.card_id is '磁条号码';

comment on column xh_bookcard.customer_id is '用户编号';

comment on column xh_bookcard.no_id is '卡面数字';

alter table xh_bookcard  add constraint pk_xh_bookcard primary key (card_id, customer_id) ;

--创建触发器tri_xh_bookcard,一旦插入的customer_id长度大于10位,则截取9位并后缀z

create or replace  trigger tri_xh_bookcard

  before insert

  on xh_bookcard

  for each row

declare

begin

  if length(:new.customer_id)>10 then

    :new.customer_id:=substr(:new.customer_id,-9,9)||'z';

    end if;

end tri_xh_bookcard;

创建好触发器之后,在All objects的Triggers中就能查到该触发器,我们可以在这里进行修改、删除,只是用界面化配置不符合东哥的性格

其中 create or replace  trigge 触发器名 before/after 操作 on 表名 for 哪一行数据 declare 这个是固定格式,创建并说明什么时候触发该trigger

begin 到 end 这里是真真的写触发器,比方说这个触发器的意思就是说 如果  customer_id 长度大于10,则从后往前截取9位(第一个参数为负,说明从后往前截取)然后后缀一个字母z,至于这里为什么从后往前截取,是因为分析了该批次数据如果从后往前截取9位是没有重复的,但是从前往后截取有一些数据就会重复,原因也很简单,因为源数据第一位都是0嘛。

至于说这个触发器为什么是修改:new.customer_id,因为我们是要新插入数据是不会有 :old.customer_id,那么为什么要用before insert而不是after insert 呢,因为insert和触发器是要操作同一个表的同一条数据,如果after之后,这个数据就已经进入数据库了,是无法操作的,只有我们操作一条数据之后在另外一个表进行累加采用after

我们这个时候插入一条数据看看

我们发现这个数据是符合我们的预期的

我们失效(disable)掉这个触发器,再插入一行数据

失效掉触发器,则插入什么就是什么了,我们重新生效(enable)触发器

我们发现他胡汉三又回来了

删除触发器的命令是  drop trigger tri_xh_bookcard ; 我们执行之后会发现查看All objects的Triggers这里已经无此触发器了,插入数据再也不会被截断了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值