我有一张像
这样的表Col1 Col2 Col3 Col4
1 abc 111 AAA
2 def 222 BBB
3 dhi 333 CCC
我需要使用存储过程更改列数据,表格应该是这样的,
Col1 Col2 Col3 Col4
AAA 111 abc 1
BBB 222 def 2
CCC 333 dhi 3
col1 data should go to -> Col4
col2 data should go to -> Col3
col3 data should go to -> Col2
col4 data should go to -> Col1
答案 0 :(得分:1)
该过程需要运行此更新语句:
CREATE PROCEDURE switch_cols IS
BEGIN
UPDATE t
SET col4 = col1,
col3 = col2,
col2 = col3,
col1 = col4;
END;
/
当然,假设所有列都属于同一类型。
答案 1 :(得分:1)
您需要实际填写专栏col1
和col4
的内容
列col2
和col3
各自相应。您无需执行任何DML
即可实现此目标,简单RENAME COLUMN
即可。
select Col1, Col2, Col3, Col4 from tab;
COL1 COL2 COL3 COL4
---------- ---------- ---------- ----------
1 abc 111 AAA
2 def 222 BBB
--- exchange col1 <-> col4
alter table TAB rename column col1 TO tmp;
alter table TAB rename column col4 TO col1;
alter table TAB rename column tmp TO col4;
--- exchange col2 <-> col3
alter table TAB rename column col2 TO tmp;
alter table TAB rename column col3 TO col2;
alter table TAB rename column tmp TO col3;
select Col1, Col2, Col3, Col4 from tab;
COL1 COL2 COL3 COL4
---------- ---------- ---------- ----------
AAA 111 abc 1
BBB 222 def 2
CCC 333 dhi 3
即使使用不同的列类型也可以。
重命名前的表格示例:
create table tab
(Col1 number,
Col2 varchar2(10),
Col3 number,
Col4 varchar2(10));
之后
CREATE TABLE TAB
("COL4" NUMBER,
"COL3" VARCHAR2(10),
"COL2" NUMBER,
"COL1" VARCHAR2(10)
);
这种方法的最大优点是,它只是元数据更新,没有真正的数据更新,因此即使对于大型表,它也可以在即时时间内准备就绪。
您必须考虑的唯一事项是,如果表格已包含列col1
,则无法将col4
简单地重命名为col4
。因此,您必须将第一列重命名为临时名称,以使目标名称免费。
唯一的副作用是,表中的h列顺序不同。如果这是相关的,只需使用新名称重新创建表,最后将原始表重命名为backup,将新表重命名为生产名称:
create table tab_new as
select
col4 col1,
col3 col2,
col2 col3,
col1 col4
from tab;
rename tab to backup;
rename tab_new to tab;
您必须转移现有索引,约束,触发器等。