Обновление 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
Итак, вы вернулись в тот же ряд.