[oracle存储过程]给表中分好的各组进行组内编号

30 篇文章 0 订阅
6 篇文章 0 订阅

现在需要给表myrecord的vc_period字段添加数据(表格创建、数据插入语句在文末附上),添加前后的情况如图所示:

 

编写存储过程,代码如下:

这里的存储过程执行一次就完了的那种,还有一种是会写入oracle数据库的。(想尝试存储过程不同写法,可以参看[oracle存储过程]将给定数据与已有的数据做比较

declare
  n_lid number; --主键id
  n_projectId number;
  n_companyId number;
  group_count number; --当前组拥有的记录条数
  my_counter number; --计数器
  --将各个分组的情况存放在游标中
  cursor data_cur is
     select l_project_id, l_company_id, count(*) from myrecord group by l_project_id, l_company_id order by l_project_id, l_company_id;
begin
  open data_cur;
  fetch data_cur into n_projectId, n_companyId, group_count;
  loop
    exit when not data_cur%found;
    my_counter:=1;
    --通过循环给各组数据进行编号
    for cr in (select l_id, l_project_Id, l_company_id from myrecord where l_project_id = n_projectId and l_company_id = n_companyId order by l_project_id, l_company_id) loop
      update myrecord set vc_period = my_counter where l_id = cr.l_id;
      dbms_output.put_line('主键id:'||cr.l_id||'====当前计数:'||my_counter);
      my_counter := my_counter + 1;
      --如果计数已经超过了该组的记录条数,说明该组的编号操作已完成
      if my_counter > group_count then
        exit;
      end if;
    end loop; --结束循环
    commit;--如果每组中的数据比较多的话,可以在循环完每组后做一次提交;数据少的话,可以在关闭游标后,一次性全部提交
    fetch data_cur into n_projectId, n_companyId, group_count;--继续从游标中取数据
   end loop;
  close data_cur;
end;

恢复到添加前的状态:

update myrecord set vc_period = null;
commit;

参考链接:

for循环基础语法update更新多行数据--“快速游标更新法”

附注(表格创建、数据插入语句):

-- Create table
create table MYRECORD
(
  l_id         NUMBER,
  l_project_id NUMBER,
  l_company_id NUMBER,
  vc_period    VARCHAR2(20)
);

insert into myrecord (L_ID, L_PROJECT_ID, L_COMPANY_ID, VC_PERIOD)
values (1, 101, 1501, null);

insert into myrecord (L_ID, L_PROJECT_ID, L_COMPANY_ID, VC_PERIOD)
values (2, 101, 1501, null);

insert into myrecord (L_ID, L_PROJECT_ID, L_COMPANY_ID, VC_PERIOD)
values (3, 101, 1501, null);

insert into myrecord (L_ID, L_PROJECT_ID, L_COMPANY_ID, VC_PERIOD)
values (4, 101, 1502, null);

insert into myrecord (L_ID, L_PROJECT_ID, L_COMPANY_ID, VC_PERIOD)
values (5, 101, 1502, null);

insert into myrecord (L_ID, L_PROJECT_ID, L_COMPANY_ID, VC_PERIOD)
values (6, 101, 1502, null);

insert into myrecord (L_ID, L_PROJECT_ID, L_COMPANY_ID, VC_PERIOD)
values (7, 101, 1502, null);

insert into myrecord (L_ID, L_PROJECT_ID, L_COMPANY_ID, VC_PERIOD)
values (8, 102, 1501, null);

insert into myrecord (L_ID, L_PROJECT_ID, L_COMPANY_ID, VC_PERIOD)
values (9, 102, 1501, null);

insert into myrecord (L_ID, L_PROJECT_ID, L_COMPANY_ID, VC_PERIOD)
values (10, 102, 1502, null);

insert into myrecord (L_ID, L_PROJECT_ID, L_COMPANY_ID, VC_PERIOD)
values (11, 102, 1503, null);

insert into myrecord (L_ID, L_PROJECT_ID, L_COMPANY_ID, VC_PERIOD)
values (12, 102, 1503, null);

insert into myrecord (L_ID, L_PROJECT_ID, L_COMPANY_ID, VC_PERIOD)
values (13, 102, 1504, null);

insert into myrecord (L_ID, L_PROJECT_ID, L_COMPANY_ID, VC_PERIOD)
values (14, 103, 1505, null);

insert into myrecord (L_ID, L_PROJECT_ID, L_COMPANY_ID, VC_PERIOD)
values (15, 103, 1506, null);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值