需要把一个表A的数据添加到另外一张表B里面
表A是从EXCEL表导入的表头和数据,很没有规律,字段都是不同的,很很多多余的字段,相当于只是一个临时表.
表B是需要用到的表
添加进来的时候需要注意,例如:表A里面有个字段为 人员(varchar2) 对应是表B里面的 userid(integer)
需要把 "人员" 为"张三"的添加到B"userid"换成 "15" (另外有一张专门的人员表,数据要对应的,这个表数据是固定的)
 
各位用存储过程怎么写啊,刚用ORACLE用的工具是 PL/SQL Developer,也不怎么熟悉,不知道有没自带的工具,各位麻烦帮帮忙,存储过程最好能运行的,我对存储过程也是刚接触.谢谢大家了表基本这样子的
表A
字段  编号  人员   地址   公司    生日
值    01    张三   广州   A公司   1999
      02    张三   广州   A公司   1999
      03    李四   深圳   B公司   1999
      04    王五   深圳   B公司   1999表B
字段   ID                 userid  address  company
值    导入的ID+10000       15     广州      101
      导入的ID+10000       15     广州      101
      导入的ID+10000       16     深圳      102
      导入的ID+10000       17     深圳      102

解决方案 »

  1.   

    而且拥有会员卡号虽然不是主键但是唯一的,如果表B里面已经有了,就不要添加了进去表A
    字段  编号          人员          地址        公司            生日      拥有会员卡号
    值    01          张三           广州        A公司           1999     11
         02          张三           广州        A公司           1999     22
         03          李四           深圳        B公司           1999     33
         04          王五           深圳        B公司           1999     44表B
    字段      ID                    userid           address           company    cardID
    值       导入的ID+10000          15               广州                   101       11
            导入的ID+10000          15              广州                    101       22
            导入的ID+10000         16              深圳                     102       33
            导入的ID+10000         17               深圳                    102       44
      

  2.   


    create or replace procedure sp_import
    as
      i_count int;  
      strID varchar2(10); --新的ID
      i_userid int;       --UserID 
      strComp varchar2(10); --公司ID
      strsql varchar2(4000);
    begin
      for r in (select * from A) loop
        --判断会员卡
        select count(*) into i_count from B where cardID = r.拥有会员卡号;    if i_count = 0 then
          strID := to_char(to_number(r.编号) + 10000);
          select userid into i_userid from table where name = r.人员; --这个表你没提供,自己对着改
           select company into strComp from tableCompany where name = r.公司; --这个表你也没提供,自己对着改
           strsql := 'insert into B(ID,userid,address,company,cardID) ' ||
                     ' values (''' || strID || ''',' || i_userid || ',''' || r.地址 || 
                     ''',' || strComp || ',' || r.拥有会员卡号 || ')';
          execute immediate strsql;
        end if;    
      end loop;
      commit;
    exception
      when others then
        --异常处理,自己写想要写什么吧
    end;
    --基本思路就是这样了,自己再调调试试
      

  3.   

    怎么会有死循环?A表有N条记录,也就循环N次就结束了
      

  4.   

    查询的sql我写出来了,你直接写成inset into tabB就行了,
    业务简单的就不用存储过程了WITH TA AS 
    (SELECT  '01' AS 编号,'张三' AS 人员, '广州' AS 地址, 'A公司' AS 公司, '1999' AS 生日, '11' AS 拥有会员卡号 FROM DUAL UNION
    SELECT  '02', '张三', '广州', 'A公司', ' 1999', '22' FROM DUAL UNION
    SELECT  '03', '李四', '深圳', 'B公司', ' 1999', '33' FROM DUAL UNION
    SELECT  '04', '王五', '深圳', 'B公司', ' 1999', '44' FROM DUAL ),
    T_USER AS (SELECT 15 AS userid, '张三' AS 人员 FROM DUAL UNION
    SELECT 16 AS userid, '李四' AS 人员 FROM DUAL UNION
    SELECT 17 AS userid, '王五' AS 人员 FROM DUAL ),
    T_company AS (SELECT 101 AS company, 'A公司' AS 公司 FROM DUAL UNION
    SELECT 102 AS company, 'B公司' AS 公司 FROM DUAL)
    SELECT TA.编号 + 10000 AS ID,
           T_USER.userid,
           TA.地址 AS address,
           T_company.company,
           TA.拥有会员卡号 AS cardID
      FROM TA
      LEFT JOIN T_USER
        ON TA.人员 = T_USER.人员
      LEFT JOIN T_company
        ON TA.公司 = T_company.公司
      

  5.   

    谢谢大家,解决了,LS的我只是一个例子,其实这个表有20多个字段的,那个EXCEL有更多,但是很多是没有用的,所以还是用2楼的方法解决的,我是新手,用了很长时间啊,呵呵,ORACLE不熟悉,存储过程也不熟悉,呵呵,练练手