Không, bạn không thể sử dụng truy vấn con để tạo danh sách cột như một phần của câu lệnh SQL.
Bạn có thể tạo câu lệnh đầy đủ từ từ điển dữ liệu:
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';
và sau đó sao chép và dán hoặc sử dụng SQL động từ một khối ẩn danh:
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;
/
Với một vài bảng giả:
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
chạy khối đó mang lại:
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
Bạn cũng có thể biến khối ẩn danh đó thành một thủ tục có hai tên bảng nếu đây là điều bạn có thể muốn làm thường xuyên (bạn đã nói rằng nó cần được sử dụng lại, nhưng điều đó có thể có nghĩa là đối với các bảng giống nhau và có thể là một khối trong một tập lệnh).
Bạn cũng có thể đi xa hơn và chỉ bao gồm các cột xuất hiện trong cả hai bảng hoặc xác minh các loại dữ liệu khớp chính xác; mặc dù đó là một công việc nhiều hơn một chút và có thể không cần thiết.