zoukankan      html  css  js  c++  java
  • 用触发器来实现Oracle的自增长列

    1, 添加id列

    -- ###############################################
    -- add ID column for XXXXXXTABLE
    -- ###############################################
    declare
        v_cnt binary_integer := 0;
    begin
    
        select count(1) into v_cnt
        from user_tab_columns e
        where e.table_name = 'XXXXXXTABLE'
          and e.column_name = 'ID';
    
        if( v_cnt = 0 ) then
            execute immediate 'alter table XXXXXXTABLE add ( ID int )';
        end if;
    end;
    /

    2,给ID列赋值

    -- ###############################################
    -- set ID value with FXNDF_FIXING_POST_SEQ for XXXXXXTABLE
    -- ###############################################
    merge into XXXXXXTABLE u 
    using ( 
    select rowid rid, rownum rnum from XXXXXXTABLE 
    ) s 
    on (u.rowid = s.rid) 
    when matched then update set u.id = s.rnum ;
    commit;

    3, 添加序列

    -- ###############################################
    -- add FXNDF_FIXING_POST_SEQ
    -- ###############################################
    declare
        v_cnt binary_integer := 0;
        v_sql varchar2(500) := '';
        v_current_max int :=0;
        
    begin
        
        select count(1) into v_cnt
        from user_sequences e
        where e.sequence_name  = 'XXXXXXTABLE_SEQ';
        
        if( v_cnt = 0 ) then
        
            select max(ID) into v_current_max from XXXXXXTABLE;
            
            select nvl(v_current_max,0) + 1 into v_current_max from dual;
            
            v_sql := 'CREATE SEQUENCE XXXXXXTABLE_SEQ MINVALUE ' || v_current_max || ' MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH ' || v_current_max;
            execute immediate v_sql;
                    
        end if;
    end;
    /

    4, 添加主键

    -- ###############################################
    -- add unit key on id for XXXXXXTABLE
    -- ###############################################
    declare
        v_cnt binary_integer :=0;
    begin
    
        select count(1) into v_cnt
        from user_constraints e
        where e.table_name = 'XXXXXXTABLE'
          and e.constraint_name  = 'PK_XXXXXXTABLE';
    
        if( v_cnt = 0 ) then
            execute immediate 'alter table XXXXXXTABLE add constraint PK_XXXXXXTABLE primary key (ID)';
        end if;
    end;
    /

    5, 添加before 触发器

    -- ###############################################
    -- add before insert trigger for XXXXXXTABLE
    -- ###############################################
    CREATE OR REPLACE TRIGGER TRG_XXXXXXTABLE_INST
      before insert ON XXXXXXTABLE   for each row
    begin
    
    select XXXXXXTABLE_SEQ.nextval into:new.ID from dual;
    
    end TRG_XXXXXXTABLE_INST;
    /
  • 相关阅读:
    【java基础】(5)静态绑定和动态绑定
    Java的接口和抽象类
    【java基础】(3)Java继承内存分配
    【java基础】(2)Java父类与子类的 内存引用讲解
    [ECMAScript 6]学习小结之---模块
    CDN 内容分发网络
    移动前端开发之viewport的深入理解
    px em rem
    https 结合使用 对称加密和非对称加密
    java Queue中 remove/poll, add/offer, element/peek区别
  • 原文地址:https://www.cnblogs.com/BenWong/p/3171844.html
Copyright © 2011-2022 走看看