批量修改Oracle序列值的存储过程
2012-03-21 10:44
330 查看
create or replace procedure p_modify_sequences is
--更新各序列值的动态sql语句
str_sql varchar2(4000);
--是否修改成功,未发生异常返回true
r boolean;
--修改相应序列的nextval
--sequencename:序列名
--talename:由序列生成主键的表名
--keyf:由序列生成的主键名
function f_modify_sequence(sequencename varchar2,
talename varchar2,
keyf varchar2) return boolean is
lastvalue integer;
currvalue integer;
f_sql varchar2(4000);
next_num number;
max_num number;
begin
--查询表中主键的最大值
f_sql := 'select max(' || keyf || ') from ' || talename;
execute immediate f_sql
into max_num;
dbms_output.put_line('表' || talename || '的' || keyf || '最大值为:' ||
max_num);
if (max_num is not null) then
next_num := max_num + 1;
--修改序列的自增量为1
f_sql := 'alter sequence ' || sequencename ||
' increment by 1 nocache';
execute immediate f_sql;
--循环
loop
--查询当前序列的下一个值
f_sql := 'select ' || sequencename || '.nextval from dual';
execute immediate f_sql
into lastvalue;
--当序列的下一个值>= 表中现有主键的最大值时退出循环
exit when lastvalue >= next_num - 1;
--如果序列的下一个值小于表中现有主键的最大值时继续获取序列的下一个值
f_sql := 'select ' || sequencename || '.nextval from dual';
execute immediate f_sql
into lastvalue;
end loop;
--修改后的sequencename.currval仍为修改前的值,但sequencename.nextval值为中主键的最大值+1
f_sql := 'alter sequence ' || sequencename ||
' increment by 1 cache 20';
execute immediate f_sql;
dbms_output.put_line('序列' || sequencename || '的下一个值为' || lastvalue);
dbms_output.put_line('');
end if;
commit;
return true;
exception
when others then
return false;
end f_modify_sequence;
begin
r := f_modify_sequence('SEQ_MENUCODE', 'T_BOSSMENU', 'MENUCODE');
r := f_modify_sequence('SEQ_FEE',
'T_BSFEE',
'to_number(substr(FEE_NO,-12))');
end p_modify_sequences;
set serveroutput on;
exec p_modify_sequences;
--更新各序列值的动态sql语句
str_sql varchar2(4000);
--是否修改成功,未发生异常返回true
r boolean;
--修改相应序列的nextval
--sequencename:序列名
--talename:由序列生成主键的表名
--keyf:由序列生成的主键名
function f_modify_sequence(sequencename varchar2,
talename varchar2,
keyf varchar2) return boolean is
lastvalue integer;
currvalue integer;
f_sql varchar2(4000);
next_num number;
max_num number;
begin
--查询表中主键的最大值
f_sql := 'select max(' || keyf || ') from ' || talename;
execute immediate f_sql
into max_num;
dbms_output.put_line('表' || talename || '的' || keyf || '最大值为:' ||
max_num);
if (max_num is not null) then
next_num := max_num + 1;
--修改序列的自增量为1
f_sql := 'alter sequence ' || sequencename ||
' increment by 1 nocache';
execute immediate f_sql;
--循环
loop
--查询当前序列的下一个值
f_sql := 'select ' || sequencename || '.nextval from dual';
execute immediate f_sql
into lastvalue;
--当序列的下一个值>= 表中现有主键的最大值时退出循环
exit when lastvalue >= next_num - 1;
--如果序列的下一个值小于表中现有主键的最大值时继续获取序列的下一个值
f_sql := 'select ' || sequencename || '.nextval from dual';
execute immediate f_sql
into lastvalue;
end loop;
--修改后的sequencename.currval仍为修改前的值,但sequencename.nextval值为中主键的最大值+1
f_sql := 'alter sequence ' || sequencename ||
' increment by 1 cache 20';
execute immediate f_sql;
dbms_output.put_line('序列' || sequencename || '的下一个值为' || lastvalue);
dbms_output.put_line('');
end if;
commit;
return true;
exception
when others then
return false;
end f_modify_sequence;
begin
r := f_modify_sequence('SEQ_MENUCODE', 'T_BOSSMENU', 'MENUCODE');
r := f_modify_sequence('SEQ_FEE',
'T_BSFEE',
'to_number(substr(FEE_NO,-12))');
end p_modify_sequences;
set serveroutput on;
exec p_modify_sequences;
相关文章推荐
- 批量修改Oracle序列值的存储过程
- 批量修改Oracle序列值的存储过程
- oracle创建定时job,job调用存储过程,批量查询,批量修改,自定义数据类型,
- oracle PL/SQL进行 建表、存储过程、序列、存储过程调用、Job
- mybatis oracle批量修改
- 使用JDBC批量修改Oracle序列步长
- Oracle序列批量重置
- Oracle删除当前用户下的所有表、视图、序列、函数、存储过程、包
- Oracle序列(Sequence)创建、使用、修改、删除
- Oracle删除当前用户下的所有表、视图、序列、函数、存储过程、包
- Oracle序列(Sequence)创建、使用、修改、删除
- oracle 修改序列起始值
- Oracle中查询索引名称,批量修改索引名称语句
- SQL 2005 批量修改表和存储过程的schema
- Oracle删除当前用户下的所有表、视图、序列、函数、存储过程、包
- oracle 批量插入-支持序列自增
- 【C#,Oracle】用批量插入和修改Oracle数据库多条数据
- Oracle创建序列存储过程
- oracle修改序列从指定值开始递增
- oracle如何修改 序列当前的最大值?