|
|
小结一下
首选感谢nyfor写出的精采代码。
高手的语言就是如此简练!
简单最美!
----------------------------------------------------------------------------------
declare
i integer := 1;
begin
for c in (select v from test group by v order by v desc) loop
update test set o = i where v = c.v;
i := i + 1;
end loop;
end;
----------------------------------------------------------------------------------
上面nyfor写的代码已经过本人测试,可在低版本oracle中执行,可应付相同数的问题,简明易读,可以说是比较完美的。
在数据量大的情况下如何呢?我建了一个有三万多记录的表:
SQL> desc test1
列名...........................可空值否...类型
------------------------------- -------- ----
BYSJ.......................... NUMBER(10,2)
BJSJ...........................NUMBER(10,2)
SQL> set timing on
SQL> select count(*) from test1;
COUNT(*)
---------
31790
实际(值):50
SQL> declare
2 i number := 1;
3 begin
4 for c in (select bysj from test1 group by bysj order by bysj desc) loop
5 update test1 set bjsj = i where bysj = c.bysj;
6 i := i + 1;
7 end loop;
8 end;
9 /
PL/SQL过程完全成功.
实际(值):2879140
-----------------------------------------------------------------------------------
环境:
SQL*Plus: Release 3.3.4.0.0
PL/SQL Release 8.0.6.0.0
表没有索引
我也不清楚2879140值转换成分钟有多少, 大概有一个多小时
如果记录数是5000条,不到二分钟(实际(值):115450)
如果记录数是999条,(integer能接受的最大值),则只有几秒钟!(实际(值):4290)
结论是记录数小于1000条,这是非常好的方法,记录数大于10000就要考虑怎样进行优化了。
当然我们的oracle版本太低,希望用高版本的朋友测一下大数据量执行情况。
再次感谢 nyfor !及各位DX! |
|