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

转载自http://blog.csdn.net/00081168/archive/2007/08/10/1736242.aspx

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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用以下步骤将 MySQL 数据格式转换为 Oracle 数据格式: 1. 导出 MySQL 数据库中的数据为 SQL 文件。你可以使用以下命令导出: ``` mysqldump -u 用户名 -p 密码 数据库名 > 导出文件名.sql ``` 2. 打开导出的 SQL 文件,用文本编辑器查找并替换以下内容: ``` ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 替换为: ``` STORAGE (BUFFER_POOL DEFAULT) CHARSET AL32UTF8; ``` 这将更改表的存储引擎及字符集。 3. 将 SQL 文件导入到 Oracle 数据库中。你可以使用以下命令导入: ``` sqlplus 用户名/密码@数据库名 @导入文件名.sql ``` 4. 确保在 Oracle 数据库中创建了与 MySQL 数据库相同的表和列,以便导入数据。 如果表的列名在 Oracle 中是关键字(如 DATE),则需要用双引号将列名括起来。 如果表中有自增列(如 AUTO_INCREMENT),则需要在 Oracle 中创建序列并使用触发器来模拟自增列。 如果表中有 ENUM 类型的列,则需要在 Oracle 中创建对应的 CHECK 约束。 如果表中有 SET 类型的列,则需要在 Oracle 中创建对应的多选列表。 5. 将 MySQL 数据库中的数据导入到 Oracle 数据库中。你可以使用以下命令导入: ``` mysql -u 用户名 -p 密码 数据库名 -e "SELECT * FROM 表名" | awk '{gsub(/\t/,","); print}' | sqlldr 用户名/密码@数据库名 control=控制文件名 ``` 其中,控制文件是一个包含导入规则的文件,它告诉 SQL*Loader 如何将数据导入到 Oracle 中。你需要编写自己的控制文件以适应你的数据格式。 这些步骤应该可以帮助你将 MySQL 数据库中的数据格式转换为 Oracle 数据库中的数据格式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值