Копирование строки в одной таблице без ввода имен столбцов 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 столбца...
Есть ли способ сделать то, что я хочу сделать?
Ответы
Ответ 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 (текст выбора). Затем скопируйте, вставьте и измените.