Обновление Oracle для безопасного разделения строки на две с помощью отката

Я работаю над существующей таблицей, в которой есть данные, похожие на:

ID | Имя | OldValue | NewValue

эти столбцы имеют данные, которые похожи на:

14 | имя | 'x=>y / zs / z

где старые и новые значения показывают изменение между значениями.

То, что я хотел бы сделать, это разделить их так, чтобы это было результатом:

15 | имя | 'x=>y' | 'x=>s' 16 | имя | "г

Мне нужно безопасно разделить эту строку на две отдельные строки, а затем удалить существующие данные, убедившись, что я могу откатить любые изменения, если они попали в вентилятор.

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

1 ответ

Решение

Сделайте INSERT и DELETE в одной транзакции. Вы всегда можете откатить транзакцию, если увидите какие-либо проблемы.

Чтобы разбить строки, взгляните на:

Например,

Настроить

SQL> CREATE TABLE t(str VARCHAR2(100));

Table created.

SQL> INSERT INTO t VALUES ('ID - Name - OldValue - NewValue');

1 row created.

SQL> COMMIT;

Commit complete.

Данные таблицы

SQL> SELECT * FROM t;

STR
-------------------------------
ID - Name - OldValue - NewValue

ВСТАВИТЬ после разделения строк и УДАЛИТЬ старую строку

SQL> BEGIN
  2  INSERT INTO t
  3  SELECT trim(regexp_substr(str, '[^-]+', 1, LEVEL)) str
  4          FROM t
  5          CONNECT BY LEVEL <= regexp_count(str, '-')+1;
  6
  7  DELETE FROM t WHERE instr(str, '-') > 0;
  8  END;
  9  /

PL/SQL procedure successfully completed.

Проверьте данные таблицы

SQL> SELECT * FROM t;

STR
---------------------
ID
Name
OldValue
NewValue

Выглядит неплохо. Строки теперь вставляются после разделения строки с разделителями, а затем удаляются старые строки.

Откат и проверить данные таблицы

SQL> ROLLBACK;

Rollback complete.

SQL> SELECT * FROM t;

STR
-------------------------------
ID - Name - OldValue - NewValue

Итак, вы вернулись в тот же ряд.

Другие вопросы по тегам