Таблица обновлений Oracle SQL строка за строкой - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь обновить DB-таблицу построчно, увеличивая ID для каждой строки.

С таблица, подобная этой

ID Foo Bar
------------
0  a   v
0  b   x
0  c   y
0  d   z
...

К

ID Foo Bar
------------
1  a   v
2  b   x
3  c   y
4  d   z
...

Есть ли быстрый и лучший способ, чем этот?

CREATE OR REPLACE PROCEDURE schema.update_foo_bar
AS
    v_i    int := 1;
BEGIN
  FOR rec IN (SELECT * FROM TEMP_FOO_BAR)
  LOOP   
        UPDATE TEMP_FOO_BAR fb
          SET fb.ID = v_i
            WHERE rec.Foo = fb.Foo
            AND rec.Bar = fb.Bar;

            v_i := v_i + 1;
  END LOOP;
END;

Что я хотел бы сделать, это просто назначить идентификатор строки вместопроверки всей таблицы на каждой итерации с помощью предложения where.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Почему бы вам не удалить этот столбец, а затем запустить таблицу изменения и добавить столбец и ограничение для обновления значения каждый раз.

0 голосов
/ 22 октября 2018

Значения ID в ожидаемом выводе можно получить только при условии, что в записях в вашей таблице есть порядок .Предполагая, что столбец Foo определяет этот порядок, вы можете сгенерировать ожидаемый результат, используя простой запрос:

SELECT
    ROW_NUMBER() OVER (ORDER BY Foo) ID,
    Foo,
    Bar
FROM TEMP_FOO_BAR
ORDER BY ID;

Проблема с использованием обновления здесь состоит в том, что, как только вы добавляете больше данных в таблицувы можете быть вынуждены сделать другое обновление.

Если вам нужно, чтобы ID вел себя как столбец автоинкремента / идентификатора, сделайте его одним, и позвольте Oracle беспокоиться о сохранении последовательности при добавлении новых данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...