我在使用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检查远程数据库。
拜托,我想要一些帮助,以便更好地实现这一目标。
我提前感谢你的帮助。
答案 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。