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