Oracle 12c程序

时间:2018-05-16 15:03:08

标签: oracle stored-procedures oracle12c

我有一张像

这样的表
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

2 个答案:

答案 0 :(得分:1)

该过程需要运行此更新语句:

CREATE PROCEDURE switch_cols IS
BEGIN
  UPDATE t
  SET col4 = col1,
      col3 = col2,
      col2 = col3,
      col1 = col4;
END;
/

当然,假设所有列都属于同一类型。

答案 1 :(得分:1)

您需要实际填写专栏col1col4的内容 列col2col3各自相应。您无需执行任何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;

您必须转移现有索引,约束,触发器等。