2011-08-01 121 views
1

更新本地数据库中,我得到了一个有点问题与Oracle查询使用远程数据库的数据

create or replace 
PROCEDURE  "LOAD_USERNAME" 
IS 
    cursor usu is 
     select userid 
     from local_user; 

BEGIN 
    for usu_rec in usu 
    loop 
     update loc_user set username =(
     select cod_user 
      from (
       select cod_user, row_number() over (order by date_createad desc) r 
       from [email protected] where cod_person=usu_rec.userid 
      ) 
      where r = 1 
     ) 
     where externaluserid=usu_rec.userid; 

    end loop; 
END; 

基本上,试图从其他数据库获取用户的代码(最后一个创建)和更新本地表。这似乎工作,但我花了太多时间。我只能通过DBLINK检查远程数据库。

请,我想要一个更好的方式来做一些帮助。

我很感谢您的帮助。

回答

1

正如Sodved说,最好曾在光标的加入。您可以尝试如下所示:

create or replace 
PROCEDURE  "LOAD_USERNAME" 
IS 
    cursor usu is 
select distinct local_user.userid,your_dblink_table.cod_user 
     from local_user, [email protected] your_dblink_table 
where local_user.userid=your_dblink_table.codperson 
and local_user.externaluserid=local_user.userid; 
BEGIN 
    for usu_rec in usu 
    loop 
     update loc_user set username =usu_rec.cod_user 
where externauserid=usu_rec.userid; 
end loop; 
commit; 
END; 

如果您必须加载大量更新,则可以尝试在光标中使用批量收集/全部方法。

4

你想尽量减少你通过网络的次数。所以你应该加入你的驱动光标的远程表,然后把用户名拉回去。这样做会更好,因为该查询只执行一次(索引/设计将决定它的运行情况)。但是,您的更新只能使用本地数据。

编辑:删除了我的PL/SQL作为@的Aitor的是更好的

0

Oracle为几种主要版本提供了内置的功能。如果您使用的是较旧的数据库,则应使用replication。在更新的版本中,这已被弃用,以支持Streams