, , , - , 2, . 11 , for update skip locked. 9i, . :
UniqueNum, (UniqueNum is a field where number does not repeat - , ) , min(), order by UniqueNum.
next_min_number select min() from. ( min UniqueNum), , . , UniqueNum.
create or replace function next_min_number
return number
is
l_res number;
row_locked exception;
pragma exception_init(row_locked, -54);
begin
for i in (select un
from t1
where flag = 'F'
order by un )
loop
begin
select un
into l_res
from t1
where un = i.un
for update nowait;
exit;
exception
when row_locked then null;
when no_data_found then null;
end;
end loop;
return l_res;
end;
. F Flag , Flag F, .
2: - `NULL ', .
:
:
create table t1(
un number,
flag varchar2(1)
);
insert into t1
select level
, 'F'
from dual
connect by level <= 3;
commit;
select *
from t1
UN FLAG
1 F
2 F
3 F
№ 1:
set serveroutput on;
var min_num number;
begin
:min_num := next_min_number;
dbms_output.put_line('Current min number: ' || to_char(:min_num));
dbms_output.put_line('Updating...');
end;
/
Current min number: 1
Updating...
PL/SQL procedure successfully completed.
№ 2
set serveroutput on;
var min_num number;
begin
:min_num := next_min_number;
dbms_output.put_line('Current min number: ' || to_char(:min_num));
dbms_output.put_line('Updating...');
end;
/
Current min number: 2
Updating...
PL/SQL procedure successfully completed
, .
.
# 1
update t1
set flag = 'T'
where flag = 'F'
and un = :min_num;
1 row updated.
commit;
# 2
update t1
set flag = 'T'
where flag = 'F'
and un = :min_num;
1 row updated.
commit;
:
select *
from t1;
UN FLAG
---------- ----
1 T
2 T
3 F
3 rows selected.