Вы можете использовать массовую обработку вместо зацикливания.Массовый DML часто может дать огромный выигрыш в производительности, и если существует большая задержка в сети, разница может быть существенной, если Oracle извлекает одну строку за раз.Уменьшение времени выполнения не исправит ошибку, но должно помочь избежать ее.(Хотя Oracle уже может выполнять эту оптимизацию за кулисами.)
РЕДАКТИРОВАТЬ
Массовая обработка может помочь, но лучшим решением, вероятно, будет использование только операторов SQL.,Я провел некоторое тестирование, и приведенная ниже версия работала примерно в 20 раз быстрее, чем оригинал.(Хотя трудно понять, насколько точно мои примерные данные и ссылка на базу данных с самоссылкой моделируют ваши реальные данные.)
BEGIN
INSERT INTO LOCAL_MASTERTABLE
(COL_A, COL_B, COL_C)
SELECT COL_A, COL_B, COL_C
FROM REMOTE_MASTERTABLE@MY_LINK
WHERE UPDATED IS NULL;
INSERT INTO LOCAL_DETAILSTABLE (COL_A, COL_D, COL_E)
SELECT REMOTE_DETAILSTABLE.COL_A, REMOTE_DETAILSTABLE.COL_D, REMOTE_DETAILSTABLE.COL_E
FROM REMOTE_DETAILSTABLE@MY_LINK
INNER JOIN (SELECT COL_A FROM REMOTE_MASTERTABLE@MY_LINK WHERE UPDATED IS NULL) TRANS
ON REMOTE_DETAILSTABLE.COL_A = TRANS.COL_A;
UPDATE REMOTE_MASTERTABLE@MY_LINK SET UPDATED = 1 WHERE UPDATED IS NULL;
END;
/