順序疑似列
順序は、一意の連続値を生成できるスキーマ・オブジェクトです。これらの値は、主キーや一意のキーによく使用されます。次の疑似列を使用したSQL文で、順序値を参照できます。
-
CURRVAL
: 順序の現在の値を戻します。 -
NEXTVAL
: 順序を増加させて次の値を戻します。
CURRVAL
とNEXTVAL
は、順序の名前で修飾する必要があります。
sequence.CURRVAL sequence.NEXTVAL
別のユーザーのスキーマ内での順序の現在の値または次の値を参照するには、その順序に対するSELECT
オブジェクト権限またはSELECT
ANY
SEQUENCE
システム権限のどちらかが必要です。さらに、その順序は、次に示すとおり、順序を含むスキーマで修飾する必要があります。
schema.sequence.CURRVAL schema.sequence.NEXTVAL
リモート・データベース上の順序の値を参照するには、次のように、データベース・リンクの完全な名前または部分的な名前で順序を修飾する必要があります。
schema.sequence.CURRVAL@dblink schema.sequence.NEXTVAL@dblink
順序には、待機またはロックすることなく多数のユーザーが同時にアクセスできます。
関連項目:
データベース・リンクの参照方法の詳細は、「リモート・データベース内のオブジェクトの参照」を参照してください。
順序値の使用場所
次の場所でCURRVAL
とNEXTVAL
を使用できます。
-
副問合せ、マテリアライズド・ビューまたはビューに含まれていない
SELECT
文のSELECT構文のリスト -
INSERT
文内の副問合せのSELECT構文のリスト -
INSERT
文のVALUES
句 -
UPDATE
文のSET
句
順序値の制限事項
次の要素では、CURRVAL
とNEXTVAL
は使用できません。
-
DELETE
文、SELECT
文またはUPDATE
文内の副問合せ -
ビューの問合せ、またはマテリアライズド・ビューの問合せ
-
DISTINCT
演算子を指定したSELECT
文 -
GROUP
BY
句またはORDER
BY
句を持つSELECT
文 -
集合演算子
UNION
、INTERSECT
またはMINUS
によって別のSELECT
文と結合されているSELECT
文 -
SELECT
文のWHERE
句 -
CHECK
制約の条件
CURRVAL
またはNEXTVAL
を使用する単一のSQL文では、参照されたLONG
列、更新された表、ロックされた表がすべて同じデータベース上にある必要があります。
順序値の使用方法
順序を作成するときに、初期値と増分値を定義できます。NEXTVAL
の最初の参照によって、順序の初期値が戻されます。その後の参照によって、定義されたNEXTVAL
増分値で順序が増加され、その新しい値が戻されます。CURRVAL
を参照すると、NEXTVAL
への最後の参照で戻された値である、順序の現在の値が常に戻されます。
セッションの順序に対してCURRVAL
を使用する前に、まずNEXTVAL
で順序を初期化してください。順序の詳細は、「CREATE SEQUENCE」を参照してください。
NEXTVAL
への参照が含まれる単一のSQL文の中では、Oracleは、次の各行につき1回順序を増加させます。
-
SELECT
文の外部問合せブロックによって戻される行。このような問合せブロックは、次の場所に指定できます。-
トップレベルの
SELECT
文 -
INSERT
...SELECT
文(単一表または複数表)。マルチテーブル・インサートの場合、NEXTVAL
への参照がVALUES
句内に存在する必要があり、マルチテーブル・インサートの複数のブランチでNEXTVAL
が参照される場合でも、副問合せによって戻される行ごとに、順序が1回更新されます。 -
CREATE
TABLE
...AS
SELECT
文 -
CREATE
MATERIALIZED
VIEW
...AS
SELECT
文
-
-
UPDATE
文で更新される行 -
VALUES
句が含まれるINSERT
文 -
INSERT
... [ALL
|FIRST
]文(マルチテーブル・インサート)。マルチテーブル・インサートは、単一のSQL文とみなされます。このため、順序のNEXTVAL
への参照では、文のSELECT
部分からの各入力レコードに対して順序が1回のみ増加されます。INSERT
... [ALL
|FIRST
]文のいずれかの部分でNEXTVAL
が複数回指定されている場合は、指定されたレコードが挿入される回数に関係なく、値はすべての挿入ブランチに対して同じになります。 -
MERGE
文でマージされる行。NEXTVAL
への参照は、merge_insert_clause
またはmerge_update_clause
あるいはその両方に指定できます。NEXTVALUE
値は、更新操作または挿入操作に順序番号が使用されない場合でも、行が更新されるか挿入されるたびに増加されます。NEXTVAL
がこれらの場所のいずれかで複数回指定されている場合、順序は各行に対して1回増加され、その行のNEXTVAL
が検出されるたびにすべて同じ値を戻します。 -
マルチテーブル
INSERT
ALL
文の入力行。NEXTVAL
は、各行に対するinsert_into_clause
マップの回数に関係なく、副問合せによって戻される各行に対して1回のみ増加されます。
これらの場所のいずれかが、NEXTVAL
を複数回参照している場合、Oracleは1回のみ順序を増加させ、NEXTVAL
が検出されるたびにすべて同じ値を戻します。
これらの場所のいずれかが、CURRVAL
とNEXTVAL
の両方を参照している場合、OracleはCURRVAL
とNEXTVAL
の両方について順序を増加させ同じ値を戻します。
順序の次の値の確認: 例
この例では、サンプル・スキーマhr
の従業員順序の次の値を選択します。
SELECT employees_seq.nextval FROM DUAL;
表への順序値の挿入: 例
次の例では、従業員順序を増加させ、サンプル表hr.employees
に挿入される新しい従業員のためにその値を使用します。
INSERT INTO employees VALUES (employees_seq.nextval, 'John', 'Doe', 'jdoe', '555-1212', TO_DATE(SYSDATE), 'PU_CLERK', 2500, null, null, 30);
順序の現在の値の再利用: 例
この例では、次の順序番号を持つ新しい順序をマスター順序表に追加します。その後、この番号を使用して関連する注文をディテール注文表に追加します。
INSERT INTO orders (order_id, order_date, customer_id) VALUES (orders_seq.nextval, TO_DATE(SYSDATE), 106); INSERT INTO order_items (order_id, line_item_id, product_id) VALUES (orders_seq.currval, 1, 2359); INSERT INTO order_items (order_id, line_item_id, product_id) VALUES (orders_seq.currval, 2, 3290); INSERT INTO order_items (order_id, line_item_id, product_id) VALUES (orders_seq.currval, 3, 2381);