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;
    /
  • 相关阅读:
    Anaconda+Tensorflow环境安装与配置
    计算机视觉(视频追踪检测分类、监控追踪)常用测试数据集
    迁移学习( Transfer Learning )
    matlab函数_连通区域
    GMM的EM算法实现
    对​O​p​e​n​C​V​直​方​图​的​数​据​结​构​C​v​H​i​s​t​o​g​r​a​m​的​理​解
    opencv基于混合高斯模型的图像分割
    LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
    视频测试序列(转)
    高职扩招,拿大专学历
  • 原文地址:https://www.cnblogs.com/BenWong/p/3171844.html
Copyright © 2011-2022 走看看