使用远程数据库数据更新本地数据库

时间:2011-08-01 06:59:17

标签: sql oracle stored-procedures plsql cursor

我在使用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 user_table@DBLINK where cod_person=usu_rec.userid
            )
            where r = 1
         ) 
      where externaluserid=usu_rec.userid;

   end loop;
END;

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

拜托,我想要一些帮助,以便更好地实现这一目标。

我提前感谢你的帮助。

3 个答案:

答案 0 :(得分:4)

您希望尽量减少通过网络的次数。因此,您应该加入驾驶游标中的远程桌面并将用户名拉回到那里。这将更好,因为该查询仅执行一次(索引/设计将决定它的进展情况)。但是,您的更新只会使用本地数据。

编辑:删除我的PL / SQL,因为@ Aitor更好

答案 1 :(得分: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, user_table@bdlink 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;

如果必须加载大量更新,可以尝试批量收集/光标中的所有方法。

答案 2 :(得分:0)

Oracle为几个主要版本提供了内置功能。如果您使用的是较旧的数据库,则应使用replication。在最近的版本中,这已被弃用,而不是Streams