Oracle从另一个没有列名的表中插入数据

时间:2018-07-25 06:45:53

标签: sql oracle

我有两个桌子。它们只是列顺序不同。

第一

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

但是我不使用它,因为我的真实表中有很多列。

有什么好主意吗?

2 个答案:

答案 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