当点击下面的这一行时,我得到的 sql 命令没有正确结束。我想将表 B 中的数据插入表 A。它们都有相同的列,但顺序可能不同。蒂亚!
Insert into a (select column_name from user_tab_columns where table_name = 'B')
select * from b
我正在使用 pl/sql 开发人员。
当点击下面的这一行时,我得到的 sql 命令没有正确结束。我想将表 B 中的数据插入表 A。它们都有相同的列,但顺序可能不同。蒂亚!
Insert into a (select column_name from user_tab_columns where table_name = 'B')
select * from b
我正在使用 pl/sql 开发人员。
在 plsql 过程中使用动态 SQL。遍历游标 for 循环中的列名并将它们添加到字符串中。然后执行查询。请参阅下面的代码(未测试)
declare
l_query varchar2(32767);
l_columns varchar2(32767);
cursor c is select column_name
from user_tab_columns
where table_name=&table_name;
begin
for r in c loop
l_columns := l_columns ||','||r.columns_name;
end loop;
-- remove first ','
l_columns := substr(l_columns,2);
l_query := 'insert into a ('||l_columns||') select '||l_columns||' from &table_name;
execute immediate l_query;
end;
在类似的情况下,我在目标表上创建了一个视图,该视图具有适当顺序的列。
例如
Table A has columns (A, B, C)
Table B has columns (B, C, A)
你创建一个像
CREATE VIEW A_V AS SELECT B,C,A FROM A;
然后你可以做一个insert into a_v select * from b;
优点是,即使将列添加到表 a 但未添加到表 b,只要它们可以为空或具有默认值,通过视图插入仍然有效。
我自动创建了 CREATE VIEW 脚本,查找表 B 的 USER_TAB_COLUMNS。
这可能会做你想要的。
INSERT INTO a (col1, col2)
SELECT col1, col2
FROM b