web-dev-qa-db-ja.com

Oracle:シーケンスMySequence.currvalはこのセッションではまだ定義されていません

これはどういう意味ですか、どうすれば回避できますか?

SELECT MySequence.CURRVAL FROM DUAL;

結果:

ORA-08002:シーケンスMySequence.CURRVALはこのセッションではまだ定義されていません

37
Doug

mysequence.CURRVALは、yourセッションのシーケンスmysequenceから取得した最新の値を返すため、セッションで少なくとも1回mysequence.NEXTVALを使用して値を取得するまで定義されません。 CURRVALの目的は、コードでシーケンス値を複数回使用できるようにすることです。

insert into parent (parent_id, ...) values (mysequence.NEXTVAL, ...);

insert into child (parent_id, ...) values (mysequence.CURRVAL, ...);

CURRVALがanyセッションによってシーケンスから取得した最後の値を返した場合、上記のコードでは役に立たず、実際にデータ破損につながる可能性があります!

49
Tony Andrews

セッションで少なくとも1回NEXTVALを使用するまで、CURRVALを使用できないことがわかります。

25
Doug

これを使って

select sequence_name, 
   to_char(min_value) min_value,
   to_char(max_value) max_value, 
   increment_by,
   cycle_flag, 
   order_flag, 
   cache_size, 
   to_char(Last_number) last_number
from user_sequences
where sequence_name='MYSEQUENCE'
13
HainKurt

ダグ、

本当の質問は、セッションでnextvalを使用していないときにcurrvalが必要な理由です。 USER/ALL/DBA_SEQUENCESビューのLAST_NUMBER列を確認できますが、使用を開始する際の同時実行性の問題について考えてください。

よろしく、ロブ。

3
Rob van Wijk
select * from user_sequences     where sequence_name='SEQ_V_WORKORDER_RECNO';

上記のクエリSEQ_V_WORKORDER_RECNO私のシーケンス名はあなたのシーケンス名に置き換えます

2
Tarun Nigam