小弟正在研究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 中。希望各位大虾帮忙。

解决方案 »

  1.   

    我自己写了一个,能工作
    create or replace procedure A as
    i number;
    cursor get_data is select distinct name, uuid, version from TableA;
    cursor return_data is select B_id, uuid, version from TableB;
    begin
    i := 1;
    for d in get_data
        loop
            insert into TableB (B_id, name, uuid, version) values (i, d.name, d.uuid, d.version);
            i := i + 1;
        end loop;for e in return_data
        loop
            update TableA set B_id = e.B_id where uuid = e.uuid and version = e.version;
        end loop;
    end;貌似执行效率很慢,不知道大虾们有没有更好的办法?
      

  2.   


    --创建表
    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
     
    看下是不是你想要的结果
      

  3.   

    我是要 TableB 存在,并且 TableB 里的数据也存在,不是只给 TableA 加一列数据。不过还是很谢谢你啊。
      

  4.   

    由于没有数据库工具,大概写了下,可能有错误,只是个思路,你可以试试
    create or replace procedure A asbegininsert 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;