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;
    /
  • 相关阅读:
    octotree神器 For Github and GitLab 火狐插件
    实用篇如何使用github(本地、远程)满足基本需求
    PPA(Personal Package Archives)简介、兴起、使用
    Sourse Insight使用过程中的常使用功能简介
    Sourse Insight使用教程及常见的问题解决办法
    github 遇到Permanently added the RSA host key for IP address '192.30.252.128' to the list of known hosts问题解决
    二叉查找树的C语言实现(一)
    初识内核链表
    container_of 和 offsetof 宏详解
    用双向链表实现一个栈
  • 原文地址:https://www.cnblogs.com/BenWong/p/3171844.html
Copyright © 2011-2022 走看看