ヘッダーをスキップ

Oracle TimesTen In-Memory Database APIおよびSQLリファレンス・ガイド リリース6.0 B25770-01 |
| 目次 | 索引

前へ | 次へ |

## CREATE SEQUENCE

CREATE SEQUENCE文は、一意な整数を生成し複数のユーザで使用するための、順序番号ジェネレータを新しく作成します。CREATE SEQUENCE文を使用して、順序の初期値、増分値、最大値、最小値、および順序のサイクルを指定できます。

アクセス制御

TimesTenインスタンスでアクセス制御が有効な場合、この文にはDDL権限が必要です。

SQL構文
CREATE SEQUENCE [Owner.]SequenceName

[INCREMENT BY IncrementValue]

[MINVALUE MinimumValue]
[MAXVALUE MaximumValue]]
[CYCLE]
パラメータ

CREATE SEQUENCEには、次のパラメータがあります。

SEQUENCE [Owner.]SequenceName | 順序番号ジェネレータの名前です。
IncrementValue | 連続する数値の増分値です。この値は正または負の整数値です。0は指定できません。値が正の場合は昇順になります。負の場合は降順になります。デフォルト値は1です。降順では、範囲はMAXVALUEからMINVALUEへ変化し、昇順ではその逆になります。
MINVALUE | 昇順の開始値です。デフォルトの最小値は1です。
MAXVALUE | 昇順の最大値、または降順の開始値です。デフォルトの最大値は、(263) -1です。この値は、BIGINTの最大値です。
CYCLE | 順序番号ジェネレータが最大値または最小値に達した後、数値の生成を続行するかどうかを指定します。デフォルトでは、順序はサイクルしません。昇順で数値が最大値に達すると、順序は始めに戻り、最小値から値を生成し続けます。降順で最小値に達すると、順序値は最大値に戻ります。CYCLEが指定されていない場合、最大/最小値に達すると順序番号ジェネレータは値の生成を停止し、エラーが返されます。

説明

- CREATE SEQUENCE文のすべてのパラメータは整数値である必要があります。
- パラメータに値を指定しない場合、TimesTenでは、1から開始し、1ずつ増加し、デフォルトの最大値を持ちサイクルしない昇順がデフォルトで作成されます。
- TimesTenにはALTER SEQUENCE文はありません。順序を変更する場合は、DROP SEQUENCE文を使用してから、同じ名前の順序を新規作成します。たとえば、MINVALUEを変更する場合、順序を削除し、同じ名前で必要なMINVALUEを持つ順序を再度作成します。

### CURRVALとNEXTVALによるSEQUENCE値の増加

SQL文でSEQUENCE値を参照するには、CURRVALとNEXTVALを使用します。

- CURRVALは、現在のセッションでNEXTVALがコールされていればその最新の値を返し、コールされていなければエラーを返します。
- NEXTVALは、指定された増分で順序の現在値を増加させ、アクセスされた行ごとに値を返します。
- NEXTVALとCURRVALは、次の場合に使用できます。

- SELECT文のSelectList。ただし、副問合せのSelectListは除きます。
- INSERT SELECTのSelectList
- UPDATE文のSET句

- 1つのSQL文で複数のNEXTVAL参照を使用した場合、TimesTenでは順序を一度だけ増加させ、すべてのNEXTVALに対して同じ値が返されます。
- SQL文にNEXTVALとCURRVALの両方が含まれている場合は、NEXTVALが最初に実行されます。CURRVALとNEXTVALは、SQL文では同じ値を持ちます。
- 順序の現在値は、接続ごとに異なります。同じデータ・ストアに2つの同時接続がある場合、各接続は同じ順序について、最後のNEXTVAL参照により設定された独自のCURRVALを取得します。
- リカバリでは、順序はロールバックされません。順序の値の範囲に幅を持たせることができます。順序の各値は一意のままです。

### 順序とレプリケーション

レプリケーションでは循環する順序がサポートされません。

データ・ストア・レベルのレプリケーション要素を持つレプリケーション・ストアに順序が作成されている場合、その順序は、デフォルトではスキームに含まれません。順序をスキームに追加するには、レプリケーションに関連するストアごとにALTER REPLICATION文を実行して、SEQUENCE ELEMENTを追加する必要があります。

順序をレプリケートする目的は、レプリケート表に移入する際に使用された可能性がある順序の値を、表の内容に正しく反映することです。したがって、順序の更新は、順序の更新後にレプリケート表の更新が発生する場合、または順序がレプリケート表の更新に使用された場合にのみレプリケートされます。

たとえば、SELECT s.nextval from SYS.DUALといった順序値の増分を伴う、順序に対する操作は、レプリケート表が更新されるまでレプリケートされません。このため、こうした順序の更新は、レプリケート表がその後に更新されるまでログからパージされないという影響があります。したがって、このような順序の更新のみがログの末尾にある場合には、ttRepSubscriberWaitおよびttRepAdmin -waitが失敗することになります。

リンク障害が発生した後、蓄積されたログを再実行することでレプリケーションを復旧できる場合、特に対応する必要はありません。

ただし、ある一定の期間障害ノードが停止していた場合、ttRepAdmin -duplicateコマンドを使用して、残ったノードのトランザクションから障害ノードのデータ・ストアを再生成する必要があります。これは、順序は障害回復時にロールバックされないためです。この場合、ttRepAdmin -duplicateコマンドはノードからノードにSEQUENCEの定義をコピーします。

たとえば、データ・ストアDB1のある順序が1から開始し1000000まで増加し、データ・ストアDB2では順序が100001から開始し200000まで増加するとします。各順序が1つ以上の表の列の値を生成するために使用される場合、各ノードはそれぞれの順序の範囲で表の行の列に値を割り当てます。

データ・ストアDB1が無効で、ttRepAdmin -duplicateコマンドを実行してデータ・ストアDB1を既存のデータ・ストアDB2から複製する必要があるとします。両方のノードはSEQUENCE値を100001から200000の間で出力します。これを回避するには、ttRepAdmin -duplicateコマンドを実行した後、アプリケーションを開始する前にフェイルオーバー・スクリプトで最初に順序をDROPしてから、重複を生成しない範囲で順序を再度CREATEする必要があります。

レプリケートされた設定でこの方法を使用すると、SEQUENCEを使用して値の一意性を確保することができます。ただし、キー値の密集度や一定の連続した増加は保証されていません。

最大値に達した場合、CREATE SEQUENCEのCYCLEオプションの値によって、SEQUENCEはサイクルする（開始値に戻る）か、エラー文を生成します。

##### 例13.38

    CREATE SEQUENCE mysequence INCREMENT BY 1 MINVALUE 2
           MAXVALUE 1000;

##### 例13.39

この例では、tab1は表内に1行のデータを持ち、CYCLEが使用されているとします。

    CREATE SEQUENCE s1 MINVALUE 2 MAXVALUE 4 CYCLE;
    SELECT s1.NEXTVAL FROM tab1;
    /* Returns the value of 2; */
    SELECT s1.NEXTVAL FROM tab1;
    /* Returns the value of 3; */
    SELECT s1.NEXTVAL FROM tab1;
    /* Returns the value of 4; */

    最大値に達した後、最小値から昇順でサイクルを開始します。

    SELECT s1.NEXTVAL FROM tab1;
    /* Returns the value of 2; */

##### 例13.40

順序を作成して順序番号を生成するには、次の文を使用します。

    CREATE SEQUENCE seq INCREMENT BY 1;
    INSERT INTO student VALUES (seq.NEXTVAL, 'Sally');

##### 例13.41

UPDATE SET句で順序を使用するには、次の文を使用します。

    UPDATE student SET studentno = seq.NEXTVAL WHERE name = 'Sally';

##### 例13.42

問合せで順序を使用するには、次の文を使用します。

    SELECT seq.CURRVAL FROM student;

関連項目

DROP SEQUENCE