-1

Oracleでシーケンスを作成し始めました。オラクルのドキュメントを調べているときに、このプロトタイプを入手しました

Create Sequence SeqTest5
Start With 0
Increment by 1
Min value 0
Maxvalue 8
NoCycle    --I got to know we can give this as 'Cycle' which will again
           -- Repeat the loop. But my doubt is why cannot we specify  number of 
           -- Loops. Such as Cycle 20             
NoCache    --I got to know we can give certain buffer lenght via cache

試してみてこのエラーが発生したので、なぜ宣言できないのか説明してください

1  create sequence seqtest4
2  cache 30,
3* cycle 20,
SQL> /
cache 30,
    *
ERROR at line 2:
ORA-00933: SQL command not properly ended

例えば:-

TNUM
     0
     1
     4
     2
     3
     5
     6
     7
     8

この 0-8 は 10 回書き込み、停止する必要があります。

4

2 に答える 2

1

サイクル数は指定できません。サイクリングしたいかどうかだけです。CREATE SEQUENCE構文はこちらです。

CREATE SEQUENCE上記にはいくつかの問題があります。

  • コンマ - それらは属していません。それらを取り除くだけです。
  • 指定-またはのみCYCLE 20を指定できます。デフォルトは です。CYCLENOCYCLENOCYCLE
  • 指定するCYCLE場合は、 も指定する必要がありますMAXVALUE

補遺: 質問は、1 ~ 8 を 10 回数えることである実際の要件で更新されました。シーケンスなしでそれを行う方法は次のとおりです。これは、数列を生成するためによく使用される Oracle のトリックに基づいています。

SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 8

上記のステートメントは、1 から 8 までの数字を順番に出力します。それを 10 回繰り返すには、別の「1 から 10」のカウンターを実行し、それを「1 から 8」に交差結合して、正しい順序であることを確認する必要があります。これは、最終的な回答に見られるように、少し複雑になります。

SELECT SeqCounter FROM (
  SELECT SeqCounter, CycleCounter FROM (
    SELECT LEVEL AS SeqCounter FROM DUAL CONNECT BY LEVEL <= 8)
  CROSS JOIN (
    SELECT LEVEL AS CycleCounter FROM DUAL CONNECT BY LEVEL <= 10)
) ORDER BY CycleCounter, SeqCounter

上記のステートメントは、質問で要求された出力を提供します。

于 2013-04-07T17:39:55.383 に答える
0

これはモジュロ関数で処理するのが最善ではないでしょうか?

CREATE SEQUENCE seqtest5 START WITH 0 INCREMENT BY 1 MINVALUE 0 MAXVALUE 80 NOCYCLE;

SELECT mod(seqtest5.nextval, 9) from dual;

0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, ...

ORA-08004: sequence SEQTEST5.NEXTVAL exceeds MAXVALUE and cannot be instantiated
于 2014-07-14T16:06:29.507 に答える