シーケンスはスレッドセーフである必要があります。
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
"2人のユーザーが同じシーケンスに同時にアクセスしている場合、シーケンス番号はそれぞれシーケンス番号は他のユーザーによっても生成されているため、ユーザーが受け取るにはギャップがある可能性があります。」数値は1、2、3、4、5ではない可能性があります(私の例のように->これを恐れる場合はキャッシュを増やすことができます)
http://forums.oracle.com/forums/thread.jspa?threadID=910428
"トランザクションをコミットするかロールバックするかに関係なく
、シーケンスは即座に永続的にインクリメントされます。シーケンスでNextValに同時にアクセスすると、常に各呼び出し元に個別の値が返されます。」
挿入が故障し、シーケンス値が必要な場合は、returning句を使用してください。
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
それからあなたはそれがその場で挿入されたことを知っています。