Копирование строки в той же таблице без необходимости вводить имена столбцов 50+ (при изменении 2 столбцов) - PullRequest
28 голосов
/ 23 сентября 2010

Во время моей работы мне обычно приходится копировать строки, меняя их первичный ключ, давая им новый штамп и, возможно, меняя внешний ключ.

Проблема в том, что я не хочу вводить все имена столбцов во время выполнения;

insert into table_name
select pk_seq.nextval, 
       'foreign-key', 
       col3,
       col4...col51
  from table_name
 where pk_id = "original_primary_key"

И если я сделаю * в операторе выбора, я не смогу обновитьпервые 2 столбца ...

Есть ли способ сделать, как я хочу это сделать?

Ответы [ 6 ]

42 голосов
/ 23 сентября 2010

Ну, это может быть не намного менее многословно, но этот PL / SQL является опцией:

15 голосов
/ 23 сентября 2010

На основании ответа Тони :

Мы знаем, что будет возвращено не более одной строки, так как мы ищем первичный ключ. И при условии, что указано правильное значение ключа, будет возвращена хотя бы одна строка. Поэтому нам не нужен цикл:

declare
    r table_name%ROWTYPE;
begin
    select *
    into r
    from table_name
    where pk_id = "original_primary_key";
-- 
    select pk_seq.nextval into r.pk_id from dual;
     -- For 11g can use instead: r.pk_id := pk_seq.nextval;
    r.fk_id := "new_foreign_key";
    insert into table_name values r;
end;
3 голосов
/ 24 сентября 2010

Вы можете просто запросить словарь данных, чтобы сгенерировать для вас SQL.

SELECT 'tbl.' || column_name || ','
FROM   user_tab_columns
WHERE  table_name = 'MYTABLE'
ORDER BY column_id;

Получите результат этого запроса, вставьте его в оператор SQL, адаптируйте при необходимости и вуаля.

2 голосов
/ 23 сентября 2010

Извините - это все или ничего.
Между SELECT * и списком конкретных столбцов нет ничего, это один или другой.

1 голос
/ 25 сентября 2010

Вы можете создать таблицу 'temp', обновить два столбца и сделать вставку-выбор из этой таблицы 'temp'.

Eaxmple:

create table temptemp as 
select *
  from table_name
 where pk_id = "original_primary_key"

update temptemp
set col1 = ...
,   col2 =....

insert into table2
select * from temptemp;
0 голосов
/ 23 сентября 2010

Вы можете создать простую хранимую процедуру, которая будет принимать имя таблицы и использовать словарь данных, чтобы записать текст оператора select (текст оператора select).Затем скопируйте, вставьте и измените.

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