Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle从另一个不带列名的表插入数据_Sql_Oracle - Fatal编程技术网

Sql Oracle从另一个不带列名的表插入数据

Sql Oracle从另一个不带列名的表插入数据,sql,oracle,Sql,Oracle,我有两张桌子。它们只是顺序不同 首先 第二 Table2 ( age surname, name ) 我想从表1向表2插入数据 如果表列顺序相同,我可以使用 insert into Table2 select * from Table1 我知道我可以用计算机解决这个问题 insert into table2 select age,surname,name from table1 但我不使用它,因为在我的实际表中有很多列 有什么好主意吗?唯一的方法是使用一些动态SQL,依靠列名;例如,假设你

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

首先

第二

Table2
(
age
surname,
name
)
我想从表1向表2插入数据

如果表列顺序相同,我可以使用

insert into Table2
select * from Table1
我知道我可以用计算机解决这个问题

insert into table2
select age,surname,name from table1
但我不使用它,因为在我的实际表中有很多列


有什么好主意吗?

唯一的方法是使用一些动态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
你可以这样做

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

你必须列出columns@Aleksej难道没有其他的方法吗?没有简单的sql;如果无法手动执行此操作(可以使用逗号复制所有列并使用toad或sqlplus将它们放入insert,或从用户选项卡中选择),则需要动态sql,即pl/sql块井或plsql块井looping@ArockiaRajV您发布的链接与sql server有关,他正在使用oracle
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