使用存储过程实现,因为我要使用job来定时执行。
有两张表A(Aid,name,age,sex,address,class,tel)和B(Bid,name,age,sex,company,salary,class)
将A表中和B表中相同的字段(字段名相同)插入到B表中。
例如A表中的数据(1,‘张三’,23,‘男’,‘北京’,‘计算机’,‘123456’)插入到B表中(null,‘张三’,23,‘男’,null,null,‘计算机’)
请问各位大神,该如果使用存储过程去实现。事先,我知道A表和B表具有相同的字段,但是我并不知道哪些字段是相同的,也就是说,需要写代码去判断两张表的相同字段。
有两张表A(Aid,name,age,sex,address,class,tel)和B(Bid,name,age,sex,company,salary,class)
将A表中和B表中相同的字段(字段名相同)插入到B表中。
例如A表中的数据(1,‘张三’,23,‘男’,‘北京’,‘计算机’,‘123456’)插入到B表中(null,‘张三’,23,‘男’,null,null,‘计算机’)
请问各位大神,该如果使用存储过程去实现。事先,我知道A表和B表具有相同的字段,但是我并不知道哪些字段是相同的,也就是说,需要写代码去判断两张表的相同字段。
解决方案 »
- oracle里德函数是不是一定要有返回值?
- 触发器调用带有commit的存储过程
- 请教一个oracle透明网关连接sql server 特定端口的问题
- 很久没有回这里了,欢迎访问我的新blog
- 请问一个存储过程
- 如何知道数据库是否使用INDEX并且得到相应参数
- oracle9i怎么安装呀,郁闷ing
- ★★★请教各位高手,怎样使两台服务器的oracle9i的数据同步?★★★
- 如何在函数中返回多个结果集,且集合个数是变化的
- 各位oracle高手,小弟在作jsp的在solaris 8 下使用resin,如何像使用odbc那样选择
- 请大家帮忙推荐一下 经典的oracle学习书籍 谢谢!
- 为什么返回值总是假呢(c的值总是0)
--判断名字相同字段SQL
select column_name from user_tab_columns t
where tale_name in('A','B')
group by column_name
having count(1) = 2;--按照这个sql进行for循环,把你的插入sql拼接起来就行了。
--有个小窍门,把B表的每一个字段都设置上默认值,这样找到相同的字段之后只需要
insert b(name,age....) select name,age... from a;
--其余未指定字段,为默认值。
sql_txt varchar2(1000);
sql_txt_columns varchar2(1000);
begin
sql_txt := 'insert into B (';
for rec in (select t1.column_name from
(select column_name from user_tab_columns where table_name='A') t1,
(select column_name from user_tab_columns where table_name='B') t2
where t1.column_name=t2.column_name) loop
sql_txt_columns := sql_txt_columns || rec.column_name || ',';
end loop;
sql_txt_columns := substr(sql_txt_columns, 1, length(sql_txt_columns)-1);
sql_txt := sql_txt || sql_txt_columns || ') select ' || sql_txt_columns || ' from A';
dbms_output.put_line(sql_txt);
execute immediate sql_txt;
end;
这样不就可以了?
还要写什么存储过程?
insert b(name,age....) select name,age... from a;
可以用merge into语句来实现。不过有几点说明,
1)假设你已经知道了主键是name,如果这个也是要做成动态查询,可以用下面语句查询,
select column_name from user_cons_columns col, user_constraints con
where con.table_name='A' and con.constraint_type='P' and col.constraint_name=con.constraint_name;
但是比较烦一点,要你自己搞了。
2)merge into的update语句不能修改关联字段,对于你的需求来说,就是name字段,所以要特殊处理。declare
sql_txt varchar2(1000);
sql_txt_columns varchar2(1000);
sql_txt_columns_update varchar2(1000);
sql_txt_columns_insert varchar2(1000);
begin
for rec in (select t1.column_name from
(select column_name from user_tab_columns where table_name='A') t1,
(select column_name from user_tab_columns where table_name='B') t2
where t1.column_name=t2.column_name) loop
sql_txt_columns := sql_txt_columns || rec.column_name || ',';
if rec.column_name <> 'NAME' then
sql_txt_columns_update := sql_txt_columns_update || 'B.' || rec.column_name ||'=A.' || rec.column_name || ',';
end if;
sql_txt_columns_insert := sql_txt_columns_insert || 'A.' || rec.column_name || ',';
end loop;
sql_txt_columns := substr(sql_txt_columns, 1, length(sql_txt_columns)-1);
sql_txt_columns_insert := substr(sql_txt_columns_insert, 1, length(sql_txt_columns_insert)-1);
sql_txt_columns_update := substr(sql_txt_columns_update, 1, length(sql_txt_columns_update)-1);
sql_txt := 'merge into B using A on(B.name=A.name) when matched then update set ' || sql_txt_columns_update
|| ' when not matched then insert (' || sql_txt_columns ||') values(' || sql_txt_columns_insert || ')';
dbms_output.put_line(sql_txt);
execute immediate sql_txt;
end;