什么是约瑟夫环:
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。
创建一个全局临时表:
create global temporary table temp(t_id int) on commit delete rows;
游标实现约瑟夫环:
declare --总人数 v_total number:=&v_total; --对应的m v_step number:=&v_step; --剩余的人数 v_surplus number; --计数 v_count number:=0;begin --将数据插入到表中 for i in 1..v_total loop insert into temp values(i); end loop; v_surplus:=v_total; while v_surplus>1 loop --声明一个游标 declare cursor c_temp is select * from temp; c_row c_temp%rowtype; begin open c_temp; loop fetch c_temp into c_row; exit when c_temp%notfound; v_count:=v_count+1; --判断是否报到m的倍数,是则从表中删除 if mod(v_count,v_step)=0 then dbms_output.put_line(c_row.t_id); delete from temp where t_id=c_row.t_id; end if; end loop; close c_temp; end; --重新计数剩余的人数 select count(*) into v_surplus from temp; end loop; commit;end;