【问题标题】:Update local database using remote database data使用远程数据库数据更新本地数据库
【发布时间】:2011-10-17 05:29:42
【问题描述】:

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 检查远程数据库。

拜托,我需要一些帮助以更好地做到这一点。

提前感谢您的帮助。

【问题讨论】:

    标签: sql oracle stored-procedures plsql cursor


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        正如 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;
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-08-09
          • 2016-11-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-17
          • 2011-11-13
          相关资源
          最近更新 更多