Последовательность должна быть потокобезопасной:
create table ORDERTEST (
ORDERID number not null ,
COLA varchar2(10) ,
INSERTDATE date default sysdate,
constraint ORDERTEST_pk primary key (orderid)
) ;
create sequence ORDERTEST_seq start with 1 nocycle nocache ;
insert into ORDERTEST (ORDERID, COLA, INSERTDATE)
select ORDERTEST_SEQ.NEXTVAL , substr(OBJECT_NAME,1,10), sysdate
from USER_OBJECTS
where rownum <= 5; --just to limit results
select *
from ORDERTEST
order by ORDERID desc ;
ORDERID COLA INSERTDATE
---------------------- ---------- -------------------------
5 C_COBJ# 16-JUL-10 12.15.36
4 UNDO$ 16-JUL-10 12.15.36
3 CON$ 16-JUL-10 12.15.36
2 I_USER1 16-JUL-10 12.15.36
1 ICOL$ 16-JUL-10 12.15.36
теперь в другом сеансе:
insert into ORDERTEST (ORDERID, COLA, INSERTDATE)
select ORDERTEST_SEQ.NEXTVAL , substr(OBJECT_NAME,1,10), sysdate
from USER_OBJECTS
where rownum <= 5; --just to limit results
select *
from ORDERTEST
order by ORDERID desc ;
5 rows inserted
ORDERID COLA INSERTDATE
---------------------- ---------- -------------------------
10 C_COBJ# 16-JUL-10 12.17.23
9 UNDO$ 16-JUL-10 12.17.23
8 CON$ 16-JUL-10 12.17.23
7 I_USER1 16-JUL-10 12.17.23
6 ICOL$ 16-JUL-10 12.17.23
Последовательность Oralce является потокобезопасной: http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/views.htm#ADMIN020 «Если два пользователя одновременно обращаются к одной и той же последовательности, то порядковые номера, которые получает каждый пользователь, могут иметь пробелы, потому что порядковые номера также генерируются другим пользователем». числа не могут быть 1,2,3,4,5 (как в моем примере --> если вы боитесь этого, вы можете поднять кеш)
это также может помочь, хотя они не размещают свой источник: http://forums.oracle.com/forums/thread.jspa?threadID=910428 "последовательность увеличивается немедленно и навсегда, независимо от того, фиксируете ли вы транзакцию или откатываете ее. Параллельный доступ NextVal к последовательности всегда будет возвращать отдельные значения для каждого звонящий».
Если вы опасаетесь, что вставки будут не по порядку, и вам нужно значение последовательности, используйте предложение return:
declare
x number ;
begin
insert into ORDERTEST (ORDERID, COLA, INSERTDATE)
values( ORDERTEST_SEQ.NEXTVAL , 'abcd', sysdate)
returning orderid into x;
dbms_output.put_line(x);
end;
--11
тогда вы знаете, что он был вставлен прямо тогда и там.
person
Harrison
schedule
16.07.2010