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.
应该是安全的
我不确定这是否正确,所以我正在寻找一些建议。
在单个事务中执行INSERT和DELETE。如果您发现任何问题,您可以随时 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
所以,你回到了同一行。
我正在处理现有的 table,其数据类似于:
编号 |名称 |旧值 |新值
这些列的数据类似于:
14 |姓名 | 'x=>y / zs / z
旧值和新值显示值之间的变化。
我想做的是拆分这些结果:
15 |姓名 | 'x=>y' | 'x=>s' 16 |姓名 | 'z
我需要安全地将此行拆分为两个单独的行,然后删除现有数据,确保我能够回滚任何更改,以防发生故障。
我的想法是,我或许应该将所有值放入一个临时的 table 中,其中的子句与我需要的相匹配。然后使用此 table 插入新行,之后删除现有行和临时 table.
应该是安全的
我不确定这是否正确,所以我正在寻找一些建议。
在单个事务中执行INSERT和DELETE。如果您发现任何问题,您可以随时 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
所以,你回到了同一行。