• 批量修改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;  
  • 相关阅读:
    【Revit API】改变填充区域的填充样式
    【Revit API】创建共享参数
    【Revit API】墙体分割
    【Revit API】FamilyInstance、FamilySymbol、Family的寻找关系
    【Revit API】创建相机视角
    【Revit API】获取链接模型中构件
    【Revit API】梁的净高分析
    【Revit API】脱离中心文件
    【Revit API】创建工作集并将element加入工作集中
    常用的XML解析函数
  • 原文地址:https://www.cnblogs.com/wjlstation/p/2409413.html
Copyright © 2020-2023  润新知