Oracle数据库 创建触发器和序列

一、触发器+序列

简介:

     在操作数据库的时候,需要在插入数据时,需要序号自增,这时我们可以先写一个序列,然后创建触发器,在数据插入时,调用触发器,让序列自增。

假设没有序列,假设数据是录入的, 这个录数据的人肯定不能保证每个商品都是唯一的编码 。

示例图:

be42e652b4ea48d3bc462e9196f3682e.png

一、序列:

-- Create sequence 
create sequence CRM_SEQ_CUSTOM_CABINETS_ID //序列名称 CRM_SEQ_CUSTOM_CABINETS_ID 
minvalue 1001
maxvalue 9999999999999999999999999
start with 10001
increment by 1
cache 20;
参数名注释
minvalue最小值
maxvalue最大值
start with从....什么数量开始
increment by步长  每次增加的数字
cache缓存

二、 触发器:

CREATE OR REPLACE TRIGGER CRM_SEQ_CUSTOM_CABINETS_TOUCH //触发器名称 CRM_SEQ_CUSTOM_CABINETS_TOUCH 
  before insert on custom_cabinets //要触发的表 custom_cabinets 
  for each row
declare
  -- local variables here
begin
  select CRM_SEQ_CUSTOM_CABINETS_ID.Nextval into :new.CABINETS_THREE_CODE from dual; //触发的表字段 CABINETS_THREE_CODE
end CRM_SEQ_CUSTOM_CABINETS_TOUCH;

触发器也可以加判断:    

        判断此字段是否为空,如果为空,则调用序列。

CREATE OR REPLACE TRIGGER CRM_SEQ_CUSTOM_CABINETS_TOUCH
  before insert on custom_cabinets
  for each row
declare
  -- local variables here
begin
 IF :NEW.CABINETS_THREE_CODE IS NULL THEN 
   select CRM_SEQ_CUSTOM_CABINETS_ID.Nextval into :new.CABINETS_THREE_CODE from dual;
 END IF;  
end CRM_SEQ_CUSTOM_CABINETS_TOUCH;

     

三、序列+触发器创建示例图:

1、如何创建

2c55bdc1d639492daa01dbde15d95ca5.png

b2a79d0402604d60aa1e58ab9e4f65b9.png

2、序列+触发器都可以这样执行 , 执行完了 我去哪里找呢?

序列 示意图:

551dd819a3754560a1d63384434d2234.png

 触发器 示意图:

8cd7b4b58ee443fba0e5350f448819ff.png

二、触发器实现自动编号

说明:  编号为“JD”+“yyyymmddhh24miss”+”0001”形式 

 触发器:

CREATE OR REPLACE TRIGGER xj_order_number --触发器名
  before insert on xj --表名
  for each row  --行级 触发
declare
  -- local variables here
  v_on varchar2(10);
begin
   if :new.ordernumber is null then
    begin
      select trim(to_char(max(substr(t.ordernumber, 18)) + 1, 'fm0009'))
        into v_on
        from xj t
       where instr(substr(trim(t.ordernumber),0,17), to_char(sysdate, 'yyyymmddhh24miss')) > 0
         and t.customersno is not null;
    exception
      when others then
        v_on := '0001';
    end;
    if trim(v_on) is null then
      v_on := '0001';
    end if;
    select 'JD'||to_char(sysdate, 'yyyymmddhh24miss') || v_on
      into :new.ordernumber
      from dual;
  end if;
end xj_order_number;

 示例图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你才是臭弟弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值