我有两个桌子。它们只是列顺序不同。
第一
Table1
(
name,
surname,
age
)
第二
Table2
(
age
surname,
name
)
我想从表1向表2插入数据。
如果表的列顺序相同,我可以使用
insert into Table2
select * from Table1
我知道我可以用
解决这个问题insert into table2
select age,surname,name from table1
但是我不使用它,因为我的真实表中有很多列。
有什么好主意吗?
答案 0 :(得分:1)
唯一的方法是依靠列名称来使用一些动态SQL。例如说您有桌子
CREATE TABLE Table1
(
name VARCHAR2(100),
surname VARCHAR2(100),
age NUMBER
);
CREATE TABLE Table2
(
name VARCHAR2(100),
age NUMBER,
oneMoreColumn NUMBER,
surname VARCHAR2(100)
);
您可以这样做:
declare
vSQL varchar2(1000);
vCols varchar2(1000);
begin
select listagg(tc1.column_name, ', ') within group (order by tc1.column_name)
into vCols
from user_tab_columns tc1
inner join user_tab_columns tc2
on(tc1.column_name = tc2.column_name)
where tc1.table_name = 'TABLE1'
and tc2.table_name = 'TABLE2';
--
vSQL := 'insert into table2( ' || vCols || ') select ' || vCols || ' from table1';
--
dbms_output.put_line(vSQL);
--
execute immediate vSQL;
end;
这将构建并执行以下语句:
insert into table2( AGE, NAME, SURNAME) select AGE, NAME, SURNAME from table1
答案 1 :(得分:1)
您可以这样做
create table EX_EMPLOYEE
(
NAME VARCHAR2(100),
PATH VARCHAR2(1000)
)
SET serveroutput ON size 2000
/
declare T_COL varchar2(50);
CURSOR c1 IS SELECT column_name name FROM user_tab_cols where table_name='EX_EMPLOYEE';
BEGIN
FOR rec IN c1 LOOP
if T_COL is null then
T_COL := T_COL || rec.name;
else
T_COL := T_COL ||' ,' || rec.name;
end if;
END LOOP;
dbms_output.put_line('select '|| T_COL ||' FROM EX_EMPLOYEE');
END;
/
select NAME ,PATH FROM EX_EMPLOYEE
PL/SQL procedure successfully completed