Oracle里批量更新列数据的问题

各位大侠好,现在遇到一个问题求教

Oracle里有两张表,一张人员信息表,里面包含了人员和各项基本信息,其中包括了银行代码和银行卡号两个字段。
另一张表是记录的银行代码和所有人的银行卡号。

现在人员表里只存了银行卡号,我想把银行代码先根据卡号从银行表里查出来,再写入到人员表里的银行代码字段。

使用了游标,发现效率很低,约20W条数据,已经执行一个多小时了,各位高手有没有其他更好的办法
问题补充
首先感谢楼上的兄弟。
我现在用的就是方法一,但是银行表里会有重复的银行卡号,要取重复的卡号中银行代码较大的那个数据,这个问题没法解决啊。

语句必须要用到索引才能快起来,否则速度没有本质上的提高。
楼主可以写语句看下执行计划。

方法1:
update t1 set column=(select * from t2 where t2.id=t1.id );
方法2:
写jdbc,从t2表取出来,
update t1 set column=?.
用batch的方法执行,应该很快就能搞定。

说个笨方法,但是速度应该不慢
insert into T3(代码,卡号)
select max(银行代码),卡号 from t2 group BY 卡号

如果语句比较慢,可以人为的将后边查询语句分成几次。

然后用表3来执行更新语句

update t1 set t1.code=(select max(t2.code) from t2 where t2.no=t1.no group by t2.code);
一条语句搞的 且效率也不低
no 卡号
code 银行代码

应该没有那么的慢吧?我上次2张表,30W数据也就2分钟多钟

1个多小时,可能ORACLE为了保证写一致性,有很多重启动SQL,而且时间越长,效率越低

要是有DBA的话,还是交给DBA来做这个事情吧,毕竟比较专业。

不知道楼主是想讨论oralce还是想解决系统问题,楼主的业务场景是?这两张表怎么维护的?考虑下你的设计??

用incline update方式更新,语法:update (select ... from a, b where a.col=b.col) set ...

[quote="mjwtx"]各位大侠好,现在遇到一个问题求教

Oracle里有两张表,一张人员信息表,里面包含了人员和各项基本信息,其中包括了银行代码和银行卡号两个字段。
另一张表是记录的银行代码和所有人的银行卡号。

现在人员表里只存了银行卡号,我想把银行代码先根据卡号从银行表里查出来,再写入到人员表里的银行代码字段。

使用了游标,发现效率很低,约20W条数据,已经执行一个多小时了,各位高手有没有其他更好的办法[/quote]
[code="sql"]
t_person(
id varchar2(40) primary key,
credit_id varchar2(40),
credit_code varchar2(40),
other varchar2(200)
);
t_credit
(id varchar2(40) primary key,
code varchar2(40) not null
);
declare
i_count integer default 0;
begin
for t in (select rowid,credit_id from t_person) loop
update t_person s set s.credit_code = (select code from t_credit t where t.id = s.credit_id) where s.rowid = t.rowid;
i_count := i_count +1;
--采用1000条提交一次,避免占用大量回退段
if mod(i_count,1000) = 0 then
i_count :=0;
commit;
end if;
commit;
end;
[/code]

不要频繁commit,能用一条sql搞定最好,越简单,速度越快.游标也可以BULK collect下,提高效率