例如A表有以下数据
ID   STATE   VALUE
2    OK      100
4    OK      200
7    INVALID 300
....B表有以下数据
ID   A.ID    COMMENT
1    1       EXAMPLE1
2    3       EXAMPLE2现在想把这些记录插入B
3    2       EXAMPLE3
4    4       EXAMPLE4

解决方案 »

  1.   

    declare
    num    number;
    begin
      select max(to_number(id)) into num from b;
      insert into b(ID, A.ID, COMMENT)
       select num+rownum, ID, VALUE from a
        where STATE='OK';
    end;
      

  2.   

    这样能够把A表中满足条件的记录的ID都插入到B表吗?
    另外A表的value和B表的comment不搭界的,B表只引用A表的ID,其余是另外赋值的
      

  3.   

    放心没问题的 把VALUE 替换成你需要的值就行
      

  4.   

    declare
      IDnum  number;
    begin
      select max(ID) into IDnum from B;
      insert into B(ID, A.ID, COMMENT)
       select IDnum+rownum, ID, 'EXAMPLE'||(IDnum+rownum) from A
        where STATE='OK';
    end;
      

  5.   

    用游标。一行行的查出A表中STATE='OK'的ID,在循环插入B表。你的B表最好有个序列,否则很麻烦。假设你有个序列se_b_id:declare
      a_id  a.id%type;
      cursor cur_a_id is
        select id from a where STATE='OK';
    begin
      open cur_a_id;
      loop
        fetch cur_id into a_id;
        EXIT WHEN CUR_A_ID%NOTFOUND;
        insert into b values (se_b_id.nextval(),a_id,comment);
      end loop;
      close cur_a_id;
    end;如果你没有序列只好用(select max(id)+1 from b)来代替se_b_id.nextval()了,执行效率大打折扣。
    另外,过程名一定要全部大写!否则备份的时候你会很意外。
      

  6.   

    我用yabbijan(new JavaDeveloper();)的方法试了一下,提示找不到B表,我的A表和B表都是在一个库的啊,是什么原因呢?另外,上面两位朋友的方法,插入B的时候B的ID都是相同的,不能做到递增啊
    B表的ID是不能相同的,所以还是有点问题。谢谢大家!希望大家继续帮我出出主意!
      

  7.   

    其中循环里都是正常的SQL语句,你换成其他表看看。要是可以的话说明你的B表就是真的不存在
      

  8.   

    谢谢大家,我已经解决了,是这样做的:
    CREATE OR REPLACE procedure atob as
       iflag  number(8);
       cursor cur_a_id is
        select a_id from a where STATE='OK';
    begin
      select max(b_id) into iflag from b;
      for data in cur_a_id loop
        iflag:=iflag+1;
        EXIT WHEN CUR_A_ID%NOTFOUND;
        insert into b values (iflag,data.a_id,'comment');
       end loop;
     end;
    /我不知道为什么yabbijan(new JavaDeveloper();)的方法不行,请大家讨论讨论,我下午结贴。
    谢谢!
      

  9.   

    重新排了下版
    CREATE OR REPLACE PROCEDURE ATOB AS
       IFLAG  NUMBER(8);
       CURSOR CUR_A_ID IS
        SELECT A_ID FROM A WHERE STATE='OK';
    BEGIN
      SELECT MAX(B_ID) INTO IFLAG FROM B;
      FOR DATA IN CUR_A_ID LOOP
        IFLAG:=IFLAG+1;
        EXIT WHEN CUR_A_ID%NOTFOUND;
        INSERT INTO B VALUES (IFLAG,DATA.A_ID,'COMMENT');
       END LOOP;
     END;
    /