Подтвердить что ты не робот

Копирование строки в одной таблице без ввода имен столбцов 50+ (при изменении 2 столбцов)

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

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

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

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

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

4b9b3361

Ответ 1

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

begin
  for r in (select *
              from table_name
             where pk_id = 'original_primary_key')
  loop
    r.pk := pk_seq.nextval;
    r.fk := 'foreign-key';
    insert into table_name values r;
  end loop;
end;

Ответ 2

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

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

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

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

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

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

Ответ 4

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

Ответ 5

Вы можете создать таблицу "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;

Ответ 6

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