龙空技术网

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

东X哥 54

前言:

眼前我们对“oracle取列最大值”大约比较关注,大家都需要知道一些“oracle取列最大值”的相关资讯。那么小编也在网络上汇集了一些对于“oracle取列最大值””的相关知识,希望大家能喜欢,我们一起来了解一下吧!

前一段时间做一批书卡,书卡有卡面数字和磁条号码组成,其中卡面数字即印制在卡片上的字符,磁条号码就是在刷卡机上刷出来的数据,这个数据进入系统之后会生成一个用户编号,最终参与结算的是用户编号,在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这里已经无此触发器了,插入数据再也不会被截断了

标签: #oracle取列最大值 #oracle 表名最大长度 #oracle数据库函数调用时间长度 #oracle数据库函数调用时间长度怎么设置 #oracle字符长度限制