存储过程算法

JS 2013-06-28 12:31:41

一个需求,可以用分析函数来解决,但是想试试通过游标来处理,其中一个已经达到目的,但是还有一个没有解决,昨天弄了半天都没解决,今天一早又起来弄,但还有有问题,来这里虚心向大神学习。

建表脚本:
create table test_20130627
(nm1 varchar2(10),
nm2 varchar2(10),
nm3 varchar2(10),
sizes varchar2(10)
;

insert into test_20130627
select '一级A','二级A','三级A','1' from dual
union all
select '一级A','二级A','三级A','2' from dual
union all
select '一级A','二级A','三级A','3' from dual
union all
select '一级A','二级A','三级A','4' from dual
union all
select '一级A','二级A','三级A','5' from dual
union all
select '一级A','二级A','三级B','1' from dual
union all
select '一级A','二级A','三级B','2' from dual
union all
select '一级A','二级A','三级B','3' from dual
union all
select '一级A','二级A','三级B','4' from dual
union all
select '一级A','二级B','三级C','1' from dual
union all
select '一级A','二级B','三级C','2' from dual
union all
select '一级A','二级B','三级C','3' from dual
union all
select '一级B','二级A','三级A','1' from dual
union all
select '一级B','二级A','三级A','2' from dual
union all
select '一级B','二级B','三级B','1' from dual
commit;

想要的结果:(就是根据nm1,nm2,nm3分组,在各组内排序)
一级A 二级A 三级Aa 1
一级A 二级A 三级Ab 2
一级A 二级A 三级Ac 3
一级A 二级A 三级Ad 4
一级A 二级A 三级Ae 5
一级A 二级A 三级Ba 1
一级A 二级A 三级Bb 2
一级A 二级A 三级Bc 3
一级A 二级A 三级Bd 4
一级A 二级B 三级Ca 1
一级A 二级B 三级Cb 2
一级A 二级B 三级Cc 3
一级B 二级A 三级Aa 1
一级B 二级A 三级Ab 2
一级B 二级B 三级Ba 1

下面是我这两天写的两个思路:
1-----------------------------------------------
/*这中方式已经达到目的,贴到这里给大家分享*/
create table temp
as
select nm1,nm2,nm3,count(1) cn from test_20130627 group by nm1,nm2,nm3;
commit;

create or replace procedure wx_20130627
is
v_n number:=1;
tmp temp%rowtype;
cursor c1 is select * from temp;
begin
open c1;
loop
fetch c1 into tmp;
v_n :=1;
exit when c1%notfound;
while v_n<=tmp.cn loop
update test_20130627 set nm3=nm3||chr(64+v_n)
where nm1=tmp.nm1
and nm2=tmp.nm2
and nm3=tmp.nm3
and sizes=v_n;
dbms_output.put_line(tmp.nm1||v_n);
v_n:=v_n+1;
end loop;
end loop;
end;
------------------------------------------------
2----------------------------------------------
/*这个语法有问题,但是不知道哪里错了,请大神看看*/
create or replace procedure wx_20130627
is
v_n number:=1;
tmp test_20130627%rowtype;
cursor c1 is select nm1,nm2,nm3 from temp;
cursor c2(p1 test_20130627%rowtype) is select * from test_20130627
where nm1=p1.nm1
and nm2=p1.nm2
and nm3=p1.nm3 for update;
begin
open c1;
loop
fetch c1 into tmp;
exit when c1%notfound;
for i in c2(tmp) loop
update test_20130627 set nm3=nm3||chr(64+v_n) where current of c2;
v_n:=v_n+1;
end loop

end loop;
close c1;
end ;
------------------------------------------------

...全文
126 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
陈字文 2013-06-29
  • 打赏
  • 举报
回复
感谢分享,如果能有需求的详细描述就更好了
 本次课程会带着大家学习Hash算法,从源码的角度去学习算法,更加容易理解的方式去学习,能够更高效的吸收学到的内容,也能培养出能够独自看源码,分析源码的能力。Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。  哈希表是根据设定的哈希函数H(key)和处理冲突方法将一组关键字映射到一个有限的地址区间上,并以关键字在地址区间中的象作为记录在表中的存储位置,这种表称为哈希表或散列,所得存储位置称为哈希地址或散列地址。作为线性数据结构与表格和队列等相比,哈希表无疑是查找速度比较快的一种。  通过将单向数学函数(有时称为“哈希算法”)应用到任意数量的数据所得到的固定大小的结果。如果输入数据中有变化,则哈希也会发生变化。哈希可用于许多操作,包括身份验证和数字签名。也称为“消息摘要”。  简单解释:哈希(Hash)算法,即散列函数。它是一种单向密码体制,即它是一个从明文到密文的不可逆的映射,只有加密过程,没有解密过程。同时,哈希函数可以将任意长度的输入经过变化以后得到固定长度的输出。哈希函数的这种单向特征和输出数据长度固定的特征使得它可以生成消息或者数据。

17,089

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧