小弟正在研究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 中。希望各位大虾帮忙。
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 中。希望各位大虾帮忙。
解决方案 »
- 编译和执行存储过程 间歇性报错 ORA-00600 内部错误代码 参数 [kcbnew_3] [18]
- Oracle监听是否可以通过SQL来查询
- "SYS"."DBMS_REPCAT_RPC",这个对象怎么会不存在呢?
- 我的oracle备份问题,关于exp
- oracle 数据库最近使用非常慢,请大侠帮忙分析一下
- ttclasses连接timesten的问题
- 关于用户访问指定表空间的问题。
- 请问存储过程中如何读取临时表的数据?
- 为鼓励大家及时结帖,能做到及时结帖的同志们进来领分:)
- 登录问题(各位请帮忙!!)
- 两台HP ProLiant DL380 G7如何做双机热备?
- oracle判断时间范围 <====>(参与就有分)
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;貌似执行效率很慢,不知道大虾们有没有更好的办法?
--创建表
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
看下是不是你想要的结果
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;