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经典算法四十题
    java经典算法四十题
    数据库表的设计总结
    (转)Eclipse 远程调试 WebSphere Application Server (WAS)
    Oracle 与 DB2 数据类型分类对应说明
    使用 XSLT 将 XML 转换为 XHTML
    寓言一则
    操作系统底层工作的整体认识
    Mysq事务
    算法导论概率发生器
  • 原文地址:https://www.cnblogs.com/BenWong/p/3171844.html
Copyright © 2011-2022 走看看