順序はデータベース表の数値列に、連続した一意の数値を自動的に生成します。 一意の主キーを自動的に生成する場合や、複数の行または表にまたがるキーを統合する場合などに有効です。
順序は表とは独立して存在するので、同一の順序を複数の表に対して指定することができます。
順序を使用することによって以下のような利点があります。
- アプリケーションのプログラムの簡易化
- 「直列化」(2つのトランザクションの文が同時に連続する番号を生成する必要のある状態)の低減による スループットの改善
順序で生成される順序番号は以下の時にスキップされるので注意が必要となります。スキップされた順序番号は欠番となるので欠番が許されない場合には、番号の管理用の表を作成しその表から「次の番号」を取ってくるといったようにする必要があります。
- 順序を使用したトランザクションをロールバックした時
- 順序番号をキャッシュさせている時にデータベースが異常終了した時
- エクスポートの最中に順序番号にアクセスがあった時
- エントリ数が同時に使用される順序の数より少なく、順序の置き換えがおこった時
順序の作成、使用、削除等で必要となる権限は以下の通りです。
順序を作成する 自分のスキーマ内 CREATE SEQUENCEシステム権限 別ユーザーのスキーマ内 CREATE ANY SEQUENCEシステム権限 順序を使用する 使用するスキーマに順序が含まれている
または別のユーザーの順序に対するSELECTオブジェクト権限順序を変更する 自分のスキーマ内 別ユーザーのスキーマ内 順序に対するALTER権限 またはALTER ANY SEQUENCEシステム権限 順序を削除する 自分のスキーマ内 別ユーザーのスキーマ内 DROP ANY SEQUENCEシステム権限
順序を作成するにはCREATE SEQUENCE文を使用します。[ ]内のパラメータは省略可能で、省略された場合デフォルトの値が設定されます。
CREATE SEQUENCE <作成する順序の名前> パラメータのデフォルト値 [ START WITH 初期値 ] ・・・昇順;最小値と同じ 降順;最大値と同じ [ INCREMENT BY 増分値 ] ・・・1 [ MAXVALUE 最大値 | NOMAXVALUE ] ・・・NOMAXVALUE [ MINVALUE 最小値 | NOMINVALUE ] ・・・NOMINVALUE [ CYCLE | NOCYCLE ] ・・・NOCYCLE [ CACHE キャッシュ | NOCACHE ] ・・・CACHE 20
パラメータ
START WITH 順序の初期値を設定します。
昇順の場合は最小値よりも大きい値、降順の場合は最大値よりも小さい値を指定することが出来ます。
28桁以内の整数値を指定出来ます。INCREMENT BY 順序の増分値を指定します。0は指定できません。
増分値は最小値と最大値の差未満の28桁の整数値を指定できます。
増分値が正の場合は昇順、負の場合は降順となります。MAXVALUE 最大値を指定します。START WITH以上であり、かつMINVALUEを下回ることは出来ません。
NOMAXVALUEを指定すると昇順は1027に、降順は-1に指定されます。MINVALUE 最小値を指定します。MAXVALUE以下であり、かつSTART WITHを越えてなければなりません。
NOMINVALUEを指定すると昇順は1に、降順は-1026に指定されます。CYCLE 順序が最大値(昇順の場合)または最小値(降順の場合)に達した時に、
引き続き最小値(ないし最大値)に戻って順序番号を生成することを指定します。
NOCYCLEを指定すると最大値または最小値に達した時、それ以上値を生成しません。CACHE より高速に値にアクセスする為に、指定された数だけ順序の値をメモリ上にキャッシュします。
このパラメータの最小値は2です。
NOCACHEを指定するとキャッシュしません。
順序が発行する番号を使用するには<順序の名前>.NEXTVALとすることで順序の生成する番号を参照することが出来ます。
たとえば、EMP表に新しい従業員「ONO」を追加する時に従業員番号を順序によって割り当てたい時は以下のように指定します。
(順序名はseq_empno)
INSERT INTO emp ( empno, ename ) VALUES ( seq_empno.NEXTVAL, 'ONO' )順序を使用した後、実際に発行された番号を知りたい場合は<順序の名前>.CURRVALを使用します。CURRVALは今SQLを発行しているセッションの中で最後に使った順序の値で、順序の全体で最後に使った値ではありません。
NEXTVALおよびCURRVALが使用できるのは次の位置です。NEXTVALとCURRVALは次の位置では使用できません。
- INSERT文のVALUESリスト
- SELECT文のSELECTリスト
- UPDATE文のSET句
よって、次のようなSELECT文はエラーとなります。
- 副問い合わせ
- ビューの問い合わせ、またはスナップショットの問い合わせ
- DISTINCT演算子を指定したSELECT文
- GROUP BY句またはORDER BY句を指定したSELECT文
- 集合演算子UNION、INTERSECT、MINUSによって、別のSELECT文と結合されているSELECT文
- SELECT文のWHERE句
- CREATE TABLE文またはALTER TABLE文における列のDEFAULT値
- CHECK制約の条件
SELECT * FROM emp WHERE empno = seq_empno.CURRVALこの場合、一度SELECT文でCURRVALを検索してから、その値をWHERE句で指定しなければなりません。
順序番号はシステム・グローバル領域(SGA)内の順序キャッシュに保持できます。キャッシュするとディスクから読み取るよりも高速に順序番号にアクセスできます。キャッシュされる順序の数は初期化パラメータSEQUENCE_CACHE_ENTRIESによって規定されます。このパラメータのデフォルト値は10エントリですが、Oracleは内部的に監査、システム権限の付与、オブジェクト権限の付与、プロファイル、ストアドプロファイルのデバッグ、ラベルのために順序を作成し、使用するのでこれらの順序も保持できるようにエントリの数を確認してください。
SEQUENCE_CACHE_ENTRIESパラメータの値が小さすぎると、順序の値がスキップされることがあります。アプリケーションで同時に使用する順序の数がエントリの数を上回った時、キャッシュ内の最も長い時間使用されていない順序が新しく使う順序によって置き換えられ、置き換えられる側の順序がキャッシュしていた順序値で未使用のものはスキップされ、欠番になってしまいます。また、ディスクの読み込みが頻繁に必要となる可能性があるので、Oracle社では「順序キャッシュがアプリケーションで同時に使用される順序を全て保持できることを確認する」というガイドラインを出しています。
キャッシュ・エントリ内の順序値のキャッシュはCREATE SEQENCE文のCACHEパラメータで決定されます。
次のCREATE SEQUENCE文は、キャッシュに50個の順序値を格納されるようにしています。CREATE SEQUENCE seq2 CACHE 50;SEQ2の最初の50個の値を、キャッシュから読み込むことができ、51番目がアクセスされると次の50個の値がディスクから読み込まれます。
CACHEに選択する値を大きくすることで、ディスクから順次キャッシュに読み込まずにアクセスできる順序の値が増えますが、インスタンス障害が発生するとキャッシュ内の順序値は全て失われます。また、エクスポートの実行中に順序番号にアクセスした場合、エクスポートされるのはキャッシュに読み込まれた数字の次の番号からになるので、キャッシュされていた順序番号のスキップが発生することがあります。
順序の定義を確認するにはuser_sequence、all_sequence、dba_sequenceを用います。実際にuser_sequenceを検索すると次のようになります。
SQL> SELECT * FROM user_sequence; SEQUENCE_N MIN_VALUE MAX_VALUE INCERMENT_BY C O CACHE_SIZE LAST_NUMBER ---------- --------- --------- ------------ - - ---------- ----------- SEQ_EMPNO 1 9999 1 N N 20 21
このユーザーの所有している順序はseq_empnoであることや、順序の最大値、最小値、増分値キャッシュサイズ等が判ります。
順序の生成方法を定義するパラメータを変更するにはALTER SEQUENCEを使用します。ただし、順序の開始番号を変更することは出来ませんので、それをしたい場合は順序を削除してから再作成しなければなりません。
Cとなっているのはcycleの事で、Nであれば値がサイクルしないことを示しています。LAST_NUMBERはキャッシュにある番号が無視されているので、次に発行される番号がLAST_NUMBER+1とは限りません。パラメータの指定方法は順序を作成する際のCREATE SEQUENCEのパラメータと同じです。
ALTER SEQUENCE <変更する順序の名前> [ INCREMENT BY 増分値 ] [ MAXVALUE 最大値 | NOMAXVALUE ] [ MINVALUE 最小値 | NOMINVALUE ] [ CYCLE | NOCYCLE ] [ CACHE キャッシュ | NOCACHE ]
順序を削除するにはDROP SEQUENCE文を使用します。
DROP SEQUENCE <削除する順序の名前> 順序が削除されると、その定義はデータ・ディクショナリから削除されます。シノニムは残りますが、参照された時にエラーを返します。
順序の初期値を再設定する方法の1つとして、順序を削除して再作成する方法があります。
その場合は再設定したい順序を削除し、START WITHに再設定した値を指定し、同じ名前で順序を作成します。
SQL> DROP SEQUENCE seq_empno; 順序が削除されました。 SQL> SELECT * FROM user_sequences; レコードが選択されませんでした。 ・・・順序seq_empnoを削除 ・・・順序が削除されたことを確認
2002/01/18 担当:Ono