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

Вы хотите свести к минимуму количество раз, когда вы проходите через сеть. Поэтому вы должны присоединиться к удаленной таблице в своем указателе движения и вытащить имя пользователя. Это будет лучше, поскольку этот запрос выполняется только один раз (индексирование/дизайн будет определять, насколько хорошо оно работает). Но ваши обновления будут работать только с локальными данными.

Edit: Удален мой PL/SQL, как @ Aitor было лучше

0

Oracle предоставил встроенные функции для такого рода вещей для нескольких основных версий. Если вы используете более старую базу данных, вы должны использовать replication. В более поздних версиях это устарело в пользу Streams.

Смежные вопросы