现在需要给表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);