批量修改Oracle序列值的存储过程

  1. create or replace procedure p_modify_sequences is  
  2.   --更新各序列值的动态sql语句      
  3.   str_sql varchar2(4000);   
  4.   --是否修改成功,未发生异常返回true      
  5.   r boolean;   
  6.   
  7.   --修改相应序列的nextval      
  8.   --sequencename:序列名      
  9.   --talename:由序列生成主键的表名      
  10.   --keyf:由序列生成的主键名      
  11.   function f_modify_sequence(sequencename varchar2,   
  12.                              talename     varchar2,   
  13.                              keyf         varchar2) return boolean is  
  14.     lastvalue integer;   
  15.     currvalue integer;   
  16.     f_sql     varchar2(4000);   
  17.     next_num  number;   
  18.     max_num   number;   
  19.   begin  
  20.     --查询表中主键的最大值      
  21.     f_sql := 'select max(' || keyf || ') from ' || talename;   
  22.     execute immediate f_sql   
  23.       into max_num;   
  24.     dbms_output.put_line('表' || talename || '的' || keyf || '最大值为:' ||   
  25.                          max_num);   
  26.     if (max_num is not nullthen  
  27.       next_num := max_num + 1;   
  28.       --修改序列的自增量为1      
  29.       f_sql := 'alter sequence ' || sequencename ||   
  30.                ' increment by 1 nocache';   
  31.       execute immediate f_sql;   
  32.        
  33.       --循环      
  34.       loop   
  35.         --查询当前序列的下一个值      
  36.         f_sql := 'select ' || sequencename || '.nextval from dual';   
  37.         execute immediate f_sql   
  38.           into lastvalue;   
  39.          
  40.         --当序列的下一个值>= 表中现有主键的最大值时退出循环      
  41.         exit when lastvalue >= next_num - 1;   
  42.         --如果序列的下一个值小于表中现有主键的最大值时继续获取序列的下一个值      
  43.         f_sql := 'select ' || sequencename || '.nextval from dual';   
  44.         execute immediate f_sql   
  45.           into lastvalue;   
  46.          
  47.       end loop;   
  48.       --修改后的sequencename.currval仍为修改前的值,但sequencename.nextval值为中主键的最大值+1      
  49.       f_sql := 'alter sequence ' || sequencename ||   
  50.                ' increment by 1 cache 20';   
  51.       execute immediate f_sql;   
  52.       dbms_output.put_line('序列' || sequencename || '的下一个值为' || lastvalue);   
  53.       dbms_output.put_line('');   
  54.     end if;   
  55.     commit;   
  56.     return true;   
  57.   exception   
  58.     when others then  
  59.       return false;   
  60.   end f_modify_sequence;   
  61.   
  62. begin  
  63.   r := f_modify_sequence('SEQ_MENUCODE''T_BOSSMENU''MENUCODE');   
  64.   r := f_modify_sequence('SEQ_FEE',   
  65.                          'T_BSFEE',   
  66.                          'to_number(substr(FEE_NO,-12))');   
  67. end p_modify_sequences;   
  68.   
  69.   
  70.   
  71. set serveroutput on;   
  72. exec p_modify_sequences;  
原文地址:https://www.cnblogs.com/wjlstation/p/2409413.html