René Nyffenegger's collection of things on the web
René Nyffenegger on Oracle - Most wanted - Feedback -
 

Insert while select loop

set feedback off

create table t_ (a number, b varchar2(10),c number);

insert into t_ values ( 1,'one', 0);
insert into t_ values ( 2,'one', 0);
insert into t_ values ( 3,'one', 0);
insert into t_ values ( 4,'one', 0);
insert into t_ values ( 5,'one', 0);
insert into t_ values ( 6,'one', 0);
insert into t_ values ( 7,'one', 0);
insert into t_ values ( 8,'one', 0);
insert into t_ values ( 9,'one', 0);
insert into t_ values (10,'one', 0);


declare
  cursor c_t is select a,b from t_ order by a;
  v_a    t_.a%type;
  v_b    t_.b%type;
begin
  open c_t;

  loop 
    fetch c_t into v_a, v_b;
    exit when c_t%notfound;

    update t_ set c=c+v_a where a=v_a;
  end loop;
end;
/

commit;

select * from t_;

declare
  cursor c_t is select a,b from t_ order by a;
  v_a    t_.a%type;
  v_b    t_.b%type;
begin
  open c_t;

  loop 
    fetch c_t into v_a, v_b;
    exit when c_t%notfound;

    update t_ set c=c+1 where c=v_a;

  end loop;
end;
/

select * from t_;


truncate table t_;

insert into t_ values ( 1,'one', 1);
insert into t_ values ( 2,'one', 2);
insert into t_ values ( 3,'one', 3);
insert into t_ values ( 4,'one', 4);
insert into t_ values ( 5,'one', 5);
insert into t_ values ( 6,'one', 6);
insert into t_ values ( 7,'one', 7);
insert into t_ values ( 8,'one', 8);
insert into t_ values ( 9,'one', 9);
insert into t_ values (10,'one',10);

declare
  cursor c_t is select a,b from t_ order by a for update;
  v_a    t_.a%type;
  v_b    t_.b%type;
begin
  open c_t;

  loop 
    fetch c_t into v_a, v_b;
    exit when c_t%notfound;

    update t_ set c=c+1 where current of c_t;

  end loop;
end;
/

select * from t_;

truncate table t_;

insert into t_ values ( 1,'one', 1);
insert into t_ values ( 2,'one', 2);
insert into t_ values ( 3,'one', 3);
insert into t_ values ( 4,'one', 4);
insert into t_ values ( 5,'one', 5);
insert into t_ values ( 6,'one', 6);
insert into t_ values ( 7,'one', 7);
insert into t_ values ( 8,'one', 8);
insert into t_ values ( 9,'one', 9);
insert into t_ values (10,'one',10);

commit;

declare
  cursor c_t is select a,b from t_ order by a;
  v_a    t_.a%type;
  v_b    t_.b%type;
begin
  open c_t;

  loop 
    fetch c_t into v_a, v_b;
    exit when c_t%notfound;

    update t_ set a = a+5;

    dbms_output.put_line('v_a: ' || v_a);

  end loop;
end;
/

select * from t_;

drop table t_;