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

Откуда:
Сообщений: 147
необходимо заинсертить в таблицу запись на основе существующей записи заменить только одно поле - id. id - primary doc формируется сиквенсом.

вопрос можно ли как нибудь заинсертить запись не перечисляя все поля, подменить только id
24 ноя 08, 17:45    [6481368]     Ответить | Цитировать Сообщить модератору
 Re: insert select  [new]
Legi
Member

Откуда:
Сообщений: 1005
select into
24 ноя 08, 17:46    [6481372]     Ответить | Цитировать Сообщить модератору
 Re: insert select  [new]
Насонов Алексей
Member

Откуда:
Сообщений: 147
Legi
select into


а поподробнее можно?
24 ноя 08, 17:48    [6481396]     Ответить | Цитировать Сообщить модератору
 Re: insert select  [new]
Alexander Konakov
Member

Откуда:
Сообщений: 1027
Насонов Алексей,

можно сделать
INSERT INTO new_table SELECT * FROM old_table
,
предварительно нарисовав триггер типа
   CREATE OR REPLACE TRIGGER my_new_trg
   BEFORE INSERT ON new_table
   FOR EACH ROW
   BEGIN
      SELECT my_seq.NEXTVAL INTO :new.id FROM DUAL;
   END;
24 ноя 08, 17:53    [6481429]     Ответить | Цитировать Сообщить модератору
 Re: insert select  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Насонов Алексей
необходимо заинсертить в таблицу запись на основе существующей записи заменить только одно поле - id. id - primary doc формируется сиквенсом.

вопрос можно ли как нибудь заинсертить запись не перечисляя все поля, подменить только id

строго говоря - нельзя (да и имхо - не нужно, ведь имена можно и запросом извлечь)
напр.
1) create view vv as select * from t
2) select text from user_views where view_name='VV'
и правьте этот запрос, на здоровье
24 ноя 08, 18:07    [6481506]     Ответить | Цитировать Сообщить модератору
 Re: insert select  [new]
Alexander Konakov
Member

Откуда:
Сообщений: 1027
orawish

напр.
1) create view vv as select * from t
2) select text from user_views where view_name='VV'
и правьте этот запрос, на здоровье

Ужас какой... :)

declare
   rec a%ROWTYPE;
begin
   SELECT * INTO rec FROM a WHERE id = :id;
   SELECT a_seq.NEXTVAL INTO rec.id FROM DUAL;
   INSERT INTO b VALUES rec;
end;
при условии полного совпадения структур таблиц.
24 ноя 08, 18:23    [6481566]     Ответить | Цитировать Сообщить модератору
 Re: insert select  [new]
ZVV
Member

Откуда: Минск
Сообщений: 744
а так не пойдёт?
Declare
   L_table   Table2%Rowtype;
Begin
   Select *
     Into L_table
     From Table2
    Where Rownum <= 1;

   L_table.Num := L_table.Num + 1;
   insert into table2 values l_table;
End;
24 ноя 08, 18:37    [6481624]     Ответить | Цитировать Сообщить модератору
 Re: insert select  [new]
Alexander Konakov
Member

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

+1 - это жесть. См.выше :)
24 ноя 08, 18:39    [6481629]     Ответить | Цитировать Сообщить модератору
 Re: insert select  [new]
ZVV
Member

Откуда: Минск
Сообщений: 744
Alexander Konakov,

ага, я уже заметил что практически продублировал. :)
сорри, отвлекался просто пока писал.

2 Афтор
возможно вы имели ввиду что нужно именно insert ... select ...?
тогда есть одна очаровательная идея:

create view v_table as 
select f(id) new_id, остальные_поля from table;

insert into table select * from v_table where ...
24 ноя 08, 18:53    [6481691]     Ответить | Цитировать Сообщить модератору
 Re: insert select  [new]
Alexander Konakov
Member

Откуда:
Сообщений: 1027
ZVV

select f(id) new_id, остальные_поля from table;

insert into table select * from v_table where ...[/src]

офигительно очаровательная идея
24 ноя 08, 18:54    [6481692]     Ответить | Цитировать Сообщить модератору
 Re: insert select  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Alexander Konakov
orawish

напр.
1) create view vv as select * from t
2) select text from user_views where view_name='VV'
и правьте этот запрос, на здоровье

Ужас какой... :)

declare
   rec a%ROWTYPE;
begin
   SELECT * INTO rec FROM a WHERE id = :id;
   SELECT a_seq.NEXTVAL INTO rec.id FROM DUAL;
   INSERT INTO b VALUES rec;
end;
при условии полного совпадения структур таблиц.

алаверды (по части ужаса ;)
вместо чтобы написать один запрос имеем три, да исчо внутрё пиэльэскуеля заобвернутых. И это чтобы вставить одну строку. Да даже и не в одной строке дело.
Дело в позиционной нотации, от которой давно надо-бы-было, а теперь уже просто пора отвыкать навсегда.
Вот, например, в 11g появились вычисляемые столбцы в таблицах. В таких таблицах dml в позиционной нотации (т.е. без перечисления таки всех вставляемых значений) просто не существует.
24 ноя 08, 19:02    [6481723]     Ответить | Цитировать Сообщить модератору
 Re: insert select  [new]
Alexander Konakov
Member

Откуда:
Сообщений: 1027
orawish

вместо чтобы написать один запрос имеем три, да исчо внутрё пиэльэскуеля заобвернутых. И это чтобы вставить одну строку. Да даже и не в одной строке дело.
Дело в позиционной нотации, от которой давно надо-бы-было, а теперь уже просто пора отвыкать навсегда.
Вот, например, в 11g появились вычисляемые столбцы в таблицах. В таких таблицах dml в позиционной нотации (т.е. без перечисления таки всех вставляемых значений) просто не существует.

Вопрос: где в моих примерах позиционная нотация? :)
Выше приведен пример с триггером - не устраивает? Аскер вообще просил сделать так, чтобы не надо было перечислять столбцы - что опять не так. Больше того (хотя не знаю, как на это отреагирует 11g с виртуальными колонками - надо попробовать) - в приведенных вариантах при изменении структуры таблиц ничего менять не потребуется.
24 ноя 08, 19:13    [6481767]     Ответить | Цитировать Сообщить модератору
 Re: insert select  [new]
Elic
Member

Откуда:
Сообщений: 29990
Alexander Konakov
Вопрос: где в моих примерах позиционная нотация? :)
В "условии полного совпадения структур таблиц". В этом нельзя быть уверенным никогда :)
24 ноя 08, 19:16    [6481776]     Ответить | Цитировать Сообщить модератору
 Re: insert select  [new]
expla
Guest
Elic,

да хоть бы и не полного. Задача скорее всего админская. Один раз id пересчитать.
24 ноя 08, 19:18    [6481782]     Ответить | Цитировать Сообщить модератору
 Re: insert select  [new]
Alexander Konakov
Member

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

Проверил на 11g - вариант со вставкой чего-то типа %ROWTYPE оно действительно не понимает. Но, сдаётся мне, это недосмотр со стороны оракла - могли бы и разрулить это дело по-нормальному.
Выход для таких апдейтов - VIEW, не включающее виртуальные колонки. Гемор, да.

Эээхх... нету щастья :)
24 ноя 08, 19:20    [6481787]     Ответить | Цитировать Сообщить модератору
 Re: insert select  [new]
ZVV
Member

Откуда: Минск
Сообщений: 744
вообщем то говоря, как я понял исходный вопрос, он был как раз про одну и ту же таблицу ;)
с "одинаковой структурой".

Хотя если говорить вообще - с доводами orawish согласен.
24 ноя 08, 19:22    [6481793]     Ответить | Цитировать Сообщить модератору
 Re: insert select  [new]
Alexander Konakov
Member

Откуда:
Сообщений: 1027
Elic
Alexander Konakov
Вопрос: где в моих примерах позиционная нотация? :)
В "условии полного совпадения структур таблиц". В этом нельзя быть уверенным никогда :)

Я, конечно, это дело всего лишь предположил - в условии задачи нету явного упоминания об этом... :)
24 ноя 08, 19:22    [6481794]     Ответить | Цитировать Сообщить модератору
 Re: insert select  [new]
Насонов Алексей
Member

Откуда:
Сообщений: 147
поправлюсь, наверное я некорректно описал задачу.

необходимо создать историческую запись в таблице на основе селекта из той же таблицы живущей записи, заменить только id .
25 ноя 08, 08:50    [6482615]     Ответить | Цитировать Сообщить модератору
 Re: insert select  [new]
Насонов Алексей
Member

Откуда:
Сообщений: 147
все, сделал так:


declare
   rec a%ROWTYPE;
begin
   SELECT * INTO rec FROM a WHERE id = :id;
   rec.id := null;  
   INSERT INTO b VALUES rec;
end;

в тиггере условие - если id is null, то брать следующее значение сиквенса.


всем спасибо.
25 ноя 08, 09:53    [6482824]     Ответить | Цитировать Сообщить модератору
 Re: insert select  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Alexander Konakov
..Вопрос: где в моих примерах позиционная нотация? :)
..

А какая же она? Всё просто. Критерий ея -- в dml(insert) нет явного списка вставляемых столбцов
,сталбыть список подтягивается из спецификации таблицы. И использование rowtype - ни разу
не исключение, а лишь вариант dml в позиционной нотации.
26 ноя 08, 10:19    [6487914]     Ответить | Цитировать Сообщить модератору
 Re: insert select  [new]
Alexander Konakov
Member

Откуда:
Сообщений: 1027
orawish
Alexander Konakov
..Вопрос: где в моих примерах позиционная нотация? :)
..

А какая же она? Всё просто. Критерий ея -- в dml(insert) нет явного списка вставляемых столбцов
,сталбыть список подтягивается из спецификации таблицы. И использование rowtype - ни разу
не исключение, а лишь вариант dml в позиционной нотации.

Меня этот вопрос, в общем-то, не беспокоит. Пока, по крайней мере. Но... Будь по Вашему :)
26 ноя 08, 13:27    [6489308]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить