Не, не можете да използвате подзаявка за генериране на списъка с колони като част от SQL оператор.
Можете да генерирате пълния израз от речника на данните:
select 'insert into cl ("'
|| listagg(column_name, '","') within group (order by column_id)
|| '") select "'
|| listagg(column_name, '","') within group (order by column_id)
|| '" from clt'
from user_tab_columns where table_name = 'CLT';
и след това или копирайте и поставете това, или използвайте динамичен SQL от анонимен блок:
declare
stmt varchar2(4000);
begin
select 'insert into cl ("'
|| listagg(column_name, '","') within group (order by column_id)
|| '") select "'
|| listagg(column_name, '","') within group (order by column_id)
|| '" from clt'
into stmt
from user_tab_columns where table_name = 'CLT';
dbms_output.put_line(stmt); -- to check and debug
execute immediate stmt;
end;
/
С няколко фиктивни таблици:
create table clt (col1 number, col2 date, col3 varchar2(10));
create table cl (col3 varchar2(10), col1 number, col2 date);
insert into clt (col1, col2, col3) values (42, date '2018-07-12', 'Test');
insert into cl
select * from clt;
SQL Error: ORA-00932: inconsistent datatypes: expected NUMBER got DATE
стартирането на този блок дава:
insert into cl ("COL1","COL2","COL3") select "COL1","COL2","COL3" from clt
PL/SQL procedure successfully completed.
select * from cl;
COL3 COL1 COL2
---------- ---------- ----------
Test 42 2018-07-12
Можете също така да превърнете този анонимен блок в процедура, която приема две имена на таблици, ако това е нещо, което е вероятно да искате да правите често (вие казахте, че трябва да се използва многократно, но това може да означава за едни и същи таблици и може просто да бъде блок в скрипт).
Можете също да отидете по-далеч и да включите само колони, които се появяват в двете таблици, или да проверите дали типовете данни съвпадат точно; въпреки че това е малко повече работа и може да не е необходимо.