日期:2014-05-16  浏览次数:21076 次

请教一个procedure的写法
小弟正在研究procedure,有一个问题需要解决

create table TableA (
  A_id number ,
  name varchar2(1024) ,
  uuid varchar2(36) ,
  version varchar2(50), 
  MMMM varchar2(40),
  NNNN varchar2(50),
  B_id number , // 新加的字段,全部为空
  primary key (A_id)
);

create table TableB (
  B_id number , 
  name varchar2(1024) , 
  uuid varchar2(36),
  version varchar2(50),  
  primary key (B_id)
);

TableA 是一张已经存在的表,里面有约 10 万条数据。 现在建一张新表 TableB, 表之间的关系是这样的。B_id将作为 TableA 的外键。
TableA 的数据中 uuid + version 的配对有很多是重复的,现在要把 重复的数据 提取到 TableB 里面。 
现在需要写一个 procedure ,首先扫描 TableA, 将 unique( uuid + version ) 的数据写到 TableB 里面,然后在回过来将 B_id 填入到 TableA 中。

希望各位大虾帮忙。

------解决方案--------------------
SQL code

--创建表
create table TableA (
  A_id number ,
  name varchar2(1024) ,
  uuid varchar2(36) ,
  version varchar2(50),  
  MMMM varchar2(40),
  NNNN varchar2(50),
  B_id number , --新加的字段,全部为空
  primary key (A_id)
);


--插入数据
insert into TableA(a_id, uuid, name, version) values(1, 'uid1', 'abc', 'version_1');
insert into TableA(a_id, uuid, name, version) values(2, 'uid1', 'abc', 'version_1');
insert into TableA(a_id, uuid, name, version) values(3, 'uid1', 'abc', 'version_1');
insert into TableA(a_id, uuid, name, version) values(4, 'uid1', 'abc', 'version_1');
insert into TableA(a_id, uuid, name, version) values(5, 'uid1', 'abc', 'version_1');
insert into TableA(a_id, uuid, name, version) values(6, 'uid2', 'abcd', 'version_2');
commit;


--数据更新
merge into TableA a
using (select t.*, rownum as b_id
         from (select uuid, version from TableA
                group by uuid, name, version) t) b
   on (a.uuid = b.uuid and a.version = b.version)
 when matched then
update set a.b_id = b.b_id;
commit;

--数据查询
select * from TableA;

      A_ID NAME           UUID         VERSION        MMMM           NNNN                 B_ID
---------- -------------- ------------ -------------- -------------- -------------- ----------
         1 abc            uid1         version_1                                             1
         2 abc            uid1         version_1                                             1
         3 abc            uid1         version_1                                             1
         4 abc            uid1         version_1                                             1
         5 abc            uid1         version_1                                             1
         6 abcd           uid2         version_2                                             2

------解决方案--------------------
由于没有数据库工具,大概写了下,可能有错误,只是个思路,你可以试试

SQL code

create or replace procedure A as

begin

insert into TableB (B_id, name, uuid, version)
select rownum as  B_id, name, uuid, version from(
select distinct d.name, d.uuid, d.version from TableA);

update TableA set B_id = (select B_id from TableB where TableB.uuid = TableA.uuid and TableB.version = TableA.version);

end;