Tidak, Anda tidak dapat menggunakan subquery untuk membuat daftar kolom sebagai bagian dari pernyataan SQL.
Anda dapat membuat pernyataan lengkap dari kamus data:
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';
lalu salin dan tempel itu, atau gunakan SQL dinamis dari blok anonim:
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;
/
Dengan beberapa tabel dummy:
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
menjalankan blok itu memberikan:
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
Anda juga dapat mengubah blok anonim itu menjadi prosedur yang menggunakan dua nama tabel jika ini adalah sesuatu yang kemungkinan besar ingin Anda lakukan (Anda mengatakan itu harus dapat digunakan kembali, tetapi itu bisa berarti untuk tabel yang sama, dan bisa saja blok dalam skrip).
Anda juga bisa melangkah lebih jauh dan hanya menyertakan kolom yang muncul di kedua tabel, atau memverifikasi tipe data yang sama persis; meskipun itu sedikit lebih banyak pekerjaan dan mungkin tidak diperlukan.