Процедура Oracle 12c - PullRequest
0 голосов
/ 16 мая 2018

У меня есть таблица типа,

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 голосов
/ 16 мая 2018

Вам действительно нужно изменить содержание столбца 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. Поэтому вы должны переименовать первый столбец во временное имя, чтобы освободить целевое имя.

Единственный побочный эффект заключается в том, что порядок столбцов в таблице другой. Если это уместно, просто заново создайте таблицу с новым именем и, наконец, переименуйте исходную таблицу в резервную копию, а новую таблицу в производительное имя:

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;

Вам нужно будет перенести существующие индексы, ограничения, триггеры и т. Д.

0 голосов
/ 16 мая 2018

Процедура должна запустить этот оператор обновления:

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

Конечно, это предполагает, что все столбцы имеют одинаковый тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...