现在有这个需求,假如,我们的项目后期,客户可能要求某个金额的精度,之前假如我们是保留的2位,后期客户让改成4位。这个时候如果我们直接去改表结构会提示,必须清空数据才能更改。这个时候,我们可以借助游标,很简单就可以实现。当然你也可以借助于临时表来实现这个功能,但是个人感觉游标还是很好的选择。下面我把语句写下来,供大家参考,有写的不对的地方,请大家给予指出,共同进步。首先说下我的思路:
思路:
1.声明一个行变量的映射,用来接收游标里面的循环行数据
2.声明游标,用来存储要修改表结构的那些行的数据
3.用 Execute immediate执行动态语句,更改表结构
4.循环游标读取数据到行变量中,然后循环更新你刚刚修改的那个列,重新赋值。
5.关闭游标,关闭循环。
我写的例子:
declare
row_stu student%rowtype;
cursor cur_stu is
select * from student;
begin
open cur_stu;
--修改列的内容为空
update student s set s.age = null;
commit;
--执行修改表结构语句
Execute immediate 'alter table STUDENT modify age NUMBER(3,2)';
--循环开始
loop
--遍历游标读取数据到定义的行映射变量里面
fetch cur_stu into row_stu;
exit when cur_stu%notfound;--退出循环
--还原表数据
update student s set s.age = row_stu.age where s.id = row_stu.id;
commit;
--循环结束
end loop;
--关闭游标
close cur_stu;
end;