2011-08-01 91 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