Oracle 更新以最安全的方式将一行分成两行并回滚

Oracle update to split a row into two in safest way with rollback

我正在处理现有的 table,其数据类似于:

编号 |名称 |旧值 |新值

这些列的数据类似于:

14 |姓名 | 'x=>y / zs / z

旧值和新值显示值之间的变化。

我想做的是拆分这些结果:

15 |姓名 | 'x=>y' | 'x=>s' 16 |姓名 | 'z

我需要安全地将此行拆分为两个单独的行,然后删除现有数据,确保我能够回滚任何更改,以防发生故障。

我的想法是,我或许应该将所有值放入一个临时的 table 中,其中的子句与我需要的相匹配。然后使用此 table 插入新行,之后删除现有行和临时 table.
应该是安全的 我不确定这是否正确,所以我正在寻找一些建议。

单个事务中执行INSERTDELETE。如果您发现任何问题,您可以随时 ROLLBACK 事务。

要拆分行,请查看:

例如,

设置

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.

Table数据

SQL> SELECT * FROM t;

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

INSERT after splitting the rows and DELETE the old row

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.

查看table数据

SQL> SELECT * FROM t;

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

看起来不错。现在在拆分定界字符串后插入行,然后删除旧行。

ROLLBACK 并检查 table 数据

SQL> ROLLBACK;

Rollback complete.

SQL> SELECT * FROM t;

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

所以,你回到了同一行。