• 用触发器来实现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;
    /
  • 相关阅读:
    SkyWorking基础:6.2版本安装部署
    ZooKeeper基础:快速部署
    Linux基础:uniq命令总结
    Linux基础:seq命令总结
    JavaScript BOM对象
    JavaScript常用项目(更新至19.11.17)
    JavaScript触发器
    JavaScript选择器和节点操作
    小花梨的取石子游戏【博弈】
    杨辉三角打表
  • 原文地址:https://www.cnblogs.com/BenWong/p/3171844.html
Copyright © 2020-2023  润新知