Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Дублирование строк в таблице с заменой некоторых значений  [new]
freshman92
Member

Откуда:
Сообщений: 5
Всем привет!

Подскажите, пожалуйста, как можно продублировать в таблице некоторые строки с изменением в них нескольких полей.
Например, у меня есть таблица с полями A, B, C, D,...,Z. Мне нужно продублировать строки, в которых поле В имеет значение '2', при этом изменив значение полей А и С.

insert into t1
select * from t1
where B = '2'


Нужно что-то вместо '*' поставить, но не знаю что. Я так понимаю, самый простой вариант - перечислить все поля с заменой некоторых, но полей очень много, да и количество их может измениться.
23 дек 13, 17:56    [15335536]     Ответить | Цитировать Сообщить модератору
 Re: Дублирование строк в таблице с заменой некоторых значений  [new]
Elic
Member

Откуда:
Сообщений: 29976
bulk collect (limit) + for + forall insert
23 дек 13, 18:14    [15335637]     Ответить | Цитировать Сообщить модератору
 Re: Дублирование строк в таблице с заменой некоторых значений  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10039
Если в это время в таблицу никто не вставляет строки, то создай BEFORE INSERT FOR EACH ROW триггер который меняет поля A &C. Затем удали триггер. Если в таблицу могут вставлять строки, выясни SID своей сессии, создай BEFORE INSERT FOR EACH ROW триггер который меняет поля A &C только если SID сессии = SID твоей сессии. Затем удали триггер.

SY.

Сообщение было отредактировано: 23 дек 13, 18:26
23 дек 13, 18:25    [15335676]     Ответить | Цитировать Сообщить модератору
 Re: Дублирование строк в таблице с заменой некоторых значений  [new]
Как вариант
Guest
freshman92,

Можно с DSQL: CTAS строки с B='2' в промежуточную т-цу + update + insert into...select
23 дек 13, 18:28    [15335687]     Ответить | Цитировать Сообщить модератору
 Re: Дублирование строк в таблице с заменой некоторых значений  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54370
Как вариант
freshman92,

Можно с DSQL: CTAS строки с B='2' в промежуточную т-цу + update + insert into...select
для динамики промежуточные таблицы не нужны
23 дек 13, 19:13    [15335863]     Ответить | Цитировать Сообщить модератору
 Re: Дублирование строк в таблице с заменой некоторых значений  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54370
Если строк немного, то самый простой (правда, самый медленный) вариант:
for rec in
(Select * from t where b=2)
Loop
   Rec.a := newValueA;
   Rec.b := newValue;
   INSERT Into t values rec;
End loop;
23 дек 13, 23:45    [15336741]     Ответить | Цитировать Сообщить модератору
 Re: Дублирование строк в таблице с заменой некоторых значений  [new]
freshman92
Member

Откуда:
Сообщений: 5
andreymx,

А если у меня запрос будет с использованием нескольких таблиц?
Вот так не прокатывает:
for rec in
(Select t1.* from t1, t2 where ...)
Loop
   Rec.a := newValueA;
   Rec.b := newValue;
   INSERT Into t1 values rec;
End loop;
25 дек 13, 18:22    [15346858]     Ответить | Цитировать Сообщить модератору
 Re: Дублирование строк в таблице с заменой некоторых значений  [new]
freshman92
Member

Откуда:
Сообщений: 5
andreymx,

А, нет, все получилось, спасибо)
25 дек 13, 18:53    [15346953]     Ответить | Цитировать Сообщить модератору
 Re: Дублирование строк в таблице с заменой некоторых значений  [new]
Elic
Member

Откуда:
Сообщений: 29976
freshman92
А, нет, все получилось
Значит созрел: 15335637 -> 12105306
25 дек 13, 19:04    [15346974]     Ответить | Цитировать Сообщить модератору
 Re: Дублирование строк в таблице с заменой некоторых значений  [new]
freshman92
Member

Откуда:
Сообщений: 5
Elic,

Вы это имели в виду?
declare
   type t1Tab is table of t1%rowtype;
   tab t1Tab;
begin 
   select t1.* 
   bulk collect into tab
   from t1, t2
   where ... ;
   
   for rec in tab
   loop
      rec.a := newValueA;
      rec.b := newValue;
   end loop;

   forall rec in tab.first .. tab.last
   insert into t1 values rec;
end;
27 дек 13, 17:04    [15356571]     Ответить | Цитировать Сообщить модератору
 Re: Дублирование строк в таблице с заменой некоторых значений  [new]
Elic
Member

Откуда:
Сообщений: 29976
freshman92
Вы это имели в виду?
Почти. Если написать это, только на PL/SQL.
27 дек 13, 17:14    [15356610]     Ответить | Цитировать Сообщить модератору
 Re: Дублирование строк в таблице с заменой некоторых значений  [new]
freshman92
Member

Откуда:
Сообщений: 5
Elic,

От каких конструкций нужно избавиться? Я пока в этой теме довольно плохо разбираюсь.
27 дек 13, 17:20    [15356638]     Ответить | Цитировать Сообщить модератору
 Re: Дублирование строк в таблице с заменой некоторых значений  [new]
Elic
Member

Откуда:
Сообщений: 29976
freshman92
От каких конструкций нужно избавиться? Я пока в этой теме довольно плохо разбираюсь.
RTFM PL/SQL Language Reference (FAQ)
27 дек 13, 17:23    [15356647]     Ответить | Цитировать Сообщить модератору
 Re: Дублирование строк в таблице с заменой некоторых значений  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54370
Elic
freshman92
От каких конструкций нужно избавиться? Я пока в этой теме довольно плохо разбираюсь.
RTFM PL/SQL Language Reference (FAQ)
ничего не скажешь, далеко послал
27 дек 13, 19:04    [15357043]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить