两个表 一个是临时表,临时表字段比正式表多一个标识,当标识为更新时,查询出临时表中的所有字段,把其插入正式表。
标识为删除 删除正式表的字段,标识为新增就在正式表中加入
恳求大侠教教我,谢谢

解决方案 »

  1.   

    create or replace procedure proc1 as
      curosr c is select * from 临时表;
    begin
      for rc in c loop
        if rc.标识 = '更新' then
          insert into 正式表 values select * from 临时表 where 正式表.主鍵=rc.主鍵;
        elsif rc.标识 = '删除' then
          delete from 正式表 where 正式表.主鍵=rc.主鍵;
        elsif rc.标识 = '新增' then
          insert into 正式表 values select * from 临时表 where 正式表.主鍵=rc.主鍵;
        end;
      end loop; 
    end;
      

  2.   

    insert into 正式表 select a,b,c,d,... from 临时表 where 标识='更新'
    delete from 正式表 where 主键(或者能唯一标示记录的字段) in (select 主键(同前面的描述) from 临时表 where 标识='删除')
    第三同第一条语句,只是标识要改成“新增”
    不过如果要多次执行这些语句,这里就要做防重复处理。
      

  3.   

    这种增删改操作的时候,一次数据量大的话,可以用分散提交。
    DECLARE
      v_commit_cnt pls_integer:=500;
      v_recod_cnt pls_integer:=0;
      CURSOR c IS  SELECT * FROM 临时表;
      a_dt c%rowtype;
    BEGIN
      OPEN the_cursor ;
      LOOP
        FETCH c INTO a_dt;
        EXIT WHEN c%NOTFOUND;
        if rc.标识 = '更新' then
          insert into 正式表 values select * from 临时表 where 正式表.主鍵=rc.主鍵;
        elsif rc.标识 = '删除' then
          delete from 正式表 where 正式表.主鍵=rc.主鍵;
        elsif rc.标识 = '新增' then
          INSERT INTO 正式表 VALUES SELECT * FROM 临时表 WHERE 正式表.主鍵=rc.主鍵;
        END if;
      IF v_recod_cnt=v_commit_cnt THEN
        COMMIT;
      ELSE
        v_recod_cnt:=v_recod_cnt+1;
      END IF;
      END loop; 
      CLOSE c;
    END;
    /
      

  4.   


    这个可以,批量DML操作时候,注意commit!不然造成回滚段空间不足!
      

  5.   

    create or replace procedure p1
    as
    begin
    for i in(select 主键,标识 from 临时表) loop
    if i.标识='更新' then
    insert 正式表 select * from 临时表 where 主键=i.主键 and 标识=i.标识;
    elsif i.标识='删除' then
    delete from 正式表 where 主键=i.主键;
    elsif i.标识='新增' then
    insert 正式表 select * from 临时表 where 主键=i.主键 and 标识=i.标识;
    end if;
    commit;
    end loop;
    end;