我试图将其中一个表的值复制到oracle中的另一个表。
可以说表原始表和临时表,因此我通常会使用以下SQL波纹管:
Insert into Original Select * from Temp where site = 1
问题是,现在我的原始表已经具有站点1,因此我需要将站点1的内容复制到将站点2更改为站点1的原始表中。我通常会这样做
Insert into Original (site, field1, field2, field3) Select '2', field1, field2, field3 from Temp where site = 1
但是,我很少有数百个表格可以做到这一点,而且我正在寻找一种无需在每个语句中输入字段名称的解决方案。
有任何想法吗?
我编写了简单的PLSQL过程,代码如下。它会生成插入字符串以输出,如果适合您,您可以复制/粘贴它们并手动运行,也可以取消注释末尾的行,并且插入将自动完成。经过样本数据测试,效果很好。
该过程对中的列进行操作user_tab_columns
。首先,您必须定义声明部分中感兴趣的表的列表。您可能需要根据需要更改一些代码。
产生的输出:
insert into original (site, F1, F2, F3) select 1, F1, F2, F3
from TEMP1 where site = 1
insert into original (site, F2, F1, F3) select 2, F2, F1, F3
from TEMP2 where site = 1
insert into original (site, F3, F2, F1) select 3, F3, F2, F1
from TEMP3 where site = 1
程序代码:
create or replace procedure justdoit is
type t_var is table of varchar2(30);
-- table names in uppercase
tabs t_var := t_var('TEMP1', 'TEMP2', 'TEMP3');
v_sql1 varchar2(4000);
v_sql2 varchar2(4000);
begin
for i in 1..tabs.count
loop
v_sql1 := 'insert into original (site, ';
v_sql2 := 'select '||i||', ';
for o in (
select * from user_tab_columns
where table_name = tabs(i)
order by column_id)
loop
if o.column_name <> 'SITE' then
v_sql1 := v_sql1 || o.column_name||', ';
v_sql2 := v_sql2 || o.column_name||', ';
end if;
end loop;
v_sql1 := rtrim(v_sql1, ', ')||') '||rtrim(v_sql2, ', ');
v_sql1 := v_sql1||' from '||tabs(i)||' where site = 1';
dbms_output.put_line(v_sql1);
-- execute immediate v_sql1; -- <- uncomment this line
end loop;
end justdoit;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句