使用存储过程实现,因为我要使用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表具有相同的字段,但是我并不知道哪些字段是相同的,也就是说,需要写代码去判断两张表的相同字段。

解决方案 »

  1.   


    --判断名字相同字段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;
    --其余未指定字段,为默认值。
      

  2.   

    declare
      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;
      

  3.   

    insert into b (select '',name,age,sex,'','', class from a)
    这样不就可以了?
    还要写什么存储过程?
      

  4.   

    游标循环
    insert b(name,age....) select name,age... from a;
      

  5.   

    用你的方法,我写好了,不过怎样避免重复的数据呢,比方说name字段是主键,从A导入到B时,如果name不存在则插入,如果name存在则更新B中的记录
      

  6.   


    可以用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;