Oracle For Loop для обновления записей в таблице - PullRequest
0 голосов
/ 18 мая 2018

У меня есть две таблицы: doc (в базе данных1) и docs (в базе данных2).Ниже приведены ключевые поля:

doc: KEY,OLD_KEY
docs: RKEY

Теперь doc.OLD_KEY = docs.RKEY.Я работаю над проверкой, где doc.OLD_KEY = docs.RKEY и устанавливаю docs.RKEY = doc.KEY.

Я написал приведенный ниже синтаксис, однако я не могу успешно запустить его, поскольку у меня нет 'Я работал с циклом for раньше.

DECLARE
  OLD_KEY_var  NUMBER(10);
  KEY_var  NUMBER(38);
BEGIN
FOR dc.KEY IN (
  SELECT dc.KEY,dc.OLD_KEY INTO KEY_var,OLD_KEY_var
  FROM user.database2 docs,database1 dc
  where docs.RKEY=dc.OLD_KEY
  ) LOOP
   UPDATE user.database2 docs SET docs.RKEY = KEY_var where docs.RKEY=OLD_KEY_var;
 END LOOP;
END;

У меня есть связь и я предоставляю привилегии между таблицами, и я получаю

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Никаких циклов или PL / SQL блок не требуется.Это будет делать одно обновление.

 UPDATE user.database2  
                 docs SET 
                   docs.RKEY = ( select KEY FROM database1 dc 
                       where 
                             docs.RKEY=dc.OLD_KEY
                             );

Предполагается, что для каждого ключа возвращается только 1 строка, в противном случае вы должны выбрать MIN(key) или MAX(key), в зависимости от того, что подходит вашим данным, во внутреннем выделении * 1006.*

0 голосов
/ 18 мая 2018

Вам не нужны переменные для этой операции. Вы можете сделать это следующим образом:

BEGIN
  FOR dc IN (SELECT dc.KEY, dc.OLD_KEY
               FROM user.database2 docs, database1 dc
              where docs.RKEY = dc.OLD_KEY) LOOP
    UPDATE user.database2 docs
       SET docs.RKEY = dc.KEY
     where docs.RKEY = dc.OLD_KEY;
  END LOOP;
END;

Но опция, предложенная xQbert, казалась намного лучше!

...