• ベストアンサー

オラクルのシーケンスについて

オラクルの連番(シーケンス)の振り方について一つお聞きしたい事がございます。 Insert時にシーケンスを使い、0から100まで順に連番を振りたいの ですが、100に到達する前に、あるタイミングで現在値を0に戻して 再び1から連番を振りたいんです。 ちなみにあるタイミングを、下記に簡単に例として書きます。 (1)ファイルから1レコードずつデータを読み込む。  (1)初回は何もチェックせずInsertをし、先頭から4バイトまでの値を変数に格納  (2)2レコード目以降は、先頭から4バイトまでの値を前回の値(変数)と比較   True(値が同じ)  ⇒順番に連番を振る   False(値が違う)  ⇒新たに0から連番を振る。              変わった値を変数に格納する。 (2)Insertをする。 私の知っている知識で行けば、シーケンスは1テーブルで一つのシーケンス しか使用できなかったはずですが・・・なにぶん知識がないので、もしか したら出来たのかな?と思ったので質問しました。 上に書いた事が可能であるかどうか教えてください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • yuji
  • ベストアンサー率37% (64/169)
回答No.2

Oracleのマニュアルを見ると、新しい番号で始めたい 場合はdrop & createしなさい、と書いてあります。 それができないなら、次の方法でできるかも??? (全く自信なし) alter sequence シーケンス名 increment by (101 - 現在の値); select シーケンス名.nextval from dual; alter sequence シーケンス名 increment by 1; これらは同一トランザクションで行ってください。 これでできなかったら、あきらめてdrop & create するか、 もしくは番号を管理するテーブルを別に作って、 自分で番号を管理するしかないでしょう。

sr20detk
質問者

お礼

御礼が遅くなりまして大変すいません。 Drop&Createが「出来る!」という人と、「出来ない」と言う人がいて、 どっちなんだろう?と思いつつ、オラクルがまだ手元に無いため検証も 出来ず、ただ「どっち??」という感じです。 オラクルが手に入りましたら、試してみたいと思います。 どうもありがとうございました。

その他の回答 (1)

  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.1

最近は、Oracleを触っていませんので単なる思い付きです。 的外れでしたらごめんなさい。 Drop Sequece ? Create Sequence ? のようなことはできませんでしたっけ。 また、できたとしても不都合があるのでしょか?

sr20detk
質問者

お礼

どうもありがとうございます。 それは私も考えたのですが、このやり方はNGみたいです。

関連するQ&A

  • oracle sequence

    oracleのシーケンスでdual表からselect文のnextvalで取得したものをインサート したいのですが、ループ内で上記処理を複数回行ったときに、値が一回目以降 更新されずに困っています。 例) for (i=0;i < 5){ (1)セレクト文発行しシーケンスを取得。 (2)取得したシーケンスを変数にセット (3)インサート実行(主キーに取得したシーケンスをセット) } こんな感じで実行したときに、はじめはシーケンスが+1されますが、 それ以降シーケンスが増加しません。そのため、重複エラーが発生してしまいます。。。 どのように対処したらよいのかまったく見当がつきません。 大変申し訳ないのですが、ご教示いただきたくよろしくお願い申し上げます。

  • oracleのシーケンスについて

    こんにちは。oracleのシーケンスについて教えてください。 次のようなシーケンスを作成します。 CREATE SEQUENCE SQC_TEST INCREMENT BY 1 START WITH 1 MAXVALUE 999999 MINVALUE 1 CASHE 20 CYCLE / この時、キャッシュ分の20という値は、いつどこでクリア?されるのか知りたいのです。 一番最初はシーケンスをクリエイトした時にキャッシュが20確保されると思うのですが、次にキャッシュが確保されるタイミングっていつなんでしょう? 最初の20を使い果たした時?それともシーケンスを作成してあるインスタンスをリブートした時?? というのは、設定したシーケンスが、実際発番していないのに一日ごとに20ずつカウントされていってるので原因をつきとめたいのです。 とりあえずはNOCACHEに設定してありますが、原因がわかれば、と思い質問させていただきました。 何かアドバイスいただけたらと思います。宜しくお願いいたします。

  • ORACLE DBへ初期化していない領域のレコードを

    ORACLE DBへ初期化していない領域のレコードを INSERTで追加した場合、どのような値のデータ(文字コード)が 格納されるのでしょうか?

  • oracle8iでのシーケンス作成

    こんにちは。教えてください。 oracleのシーケンスなんですが、シーケンスを作成するときに cycleでmax値を超えると値が元に戻るっていうのがあると思うのですが、 それと同様に、たとえば2001年から2002年に変わったタイミングで シーケンスの値を1に戻す、という設定方法はあるのでしょうか。 よろしくご教授ください。

  • VBからオラクルの先頭レコードを取得

    VB6をoo4oでオラクルに接続しています。オラクルのテーブルの先頭レコード値や次のレコードの値の取得方法を教えて下さい。フィールドの値を参照して取得するのではなく、ただ単に先頭レコードや次のレコードの値を取得したいです。教えて下さい!

  • SQL シーケンスについて

    Orcle8iを使用しています。 INSERT INTO SELECT で別のテーブルのデータを追加したいのですが、そのうち1つフィールドには、シーケンスオブジェクトで取得した値を入れたいと思っていますが、INSERT文が作れません・・・。 例えば ----------------------------- INSERT INTO TABLE1(FIELD1,FIELD2,FIELD3)   SELECT --SELECT SEQ.NEXTVAL FROM DUAL??--     FIELD1_2,     FIELD1_3 FROM TABLE2 WHERE FILED1_2='X'; ----------------------------- という場合、TABLE1のFIELD1に連番を入れたいのですが 書き方が分かりません。 http://www.okweb.ne.jp/kotaeru.php3?q=347146 上記URLの質問に、シーケンスのSELECT文を副問い合わせにして・・・という回答があったのですが、それもよく理解できませんでした・・・(T_T) シーケンスのSELECT文をどう埋め込めば良いのでしょうか? どなかた教えていただけませんか? よろしくお願いします。

  • オラクル10で特定のレコードの複写を行うSQLはあるのでしょうか?

    オラクル10で特定のレコードの複写を行うSQLはあるのでしょうか? レコードにはユニークキーがあるので、そのまま複写はできないと思いますが、 この場合は他の言語で素直にそのレコードを変数に読み込んで、ユニークキーをセット後、 INSERTで発行する手段しかないのでしょうか?

  • シーケンス型で取得した値を別テーブルで利用する方法

    シーケンス型で取得した値を別テーブルで利用する方法を別テーブルの設定したい場合,どうすればいいでしょうか. 例えば,商品情報が入っている商品テーブルのidを価格テーブルに結びつけたい場合 ・トランザクション開始 ・商品テーブルにinsert ・コミット ・トランザクション開始 ・シーケンスより最大値を取得 ・価格テーブルにシーケンスより得られた値を含めてinsert ・コミット このままですと価格テーブルの時に何らかの問題でロールバックした場合,商品テーブルには価格テーブルと関係性がないレコードができてしまいます.

  • カーソルで取得した項目のサイズについて質問です。。

    カーソルで取得した項目のサイズについて質問です。。 SELECTした項目のサイズが下記の場合、 レコード格納変数.Cの最大サイズは(14)で、それ以上のバイト数値を代入すると エラーになると思ったのですが、エラーになりませんでした。(最大28バイトになった) レコード格納変数の取得した項目サイズは何で決まってくるのでしょうか? この項目を別テーブルのVARCHAR(20)の項目へ設定しようと思っているのですが、 理由がわからないので、このままでいいのか、サイズを考慮した設計にするべきか困っています。 <oracle 9i> TABLE1{A VARCHAR2(4), B VARCHAR2(10)} DECLARE  CURSOR カーソル変数 IS SELECT A||B AS C FROM TABLE1;  レコード格納変数 カーソル変数%ROWTYPE; BEGIN  OPEN カーソル変数  LOOP   FETCH カーソル変数 INTO レコード格納変数;   EXIT WHEN カーソル変数%NOTFOUND;    :    レコード格納変数.C := VARCAHR2(15) --代入可能?    :    INSERT 項目1 VARCHAR(20) TABLE2 レコード格納変数.C;    :  END LOOP  CLOSE カーソル変数 END;

  • Oracle SQLで文字列操作

    始めまして。 VB6でプログラミングをしています。DBはOracle8.16です。 Oracleテーブル上で、カテゴリー別に " 文字列 & ナンバリング " の値をもつレコードを、インサートしていく作業をしています。 ナンバリングの部分の現在の最大値に1足したものを、 新規レコードで値を持たせインサートしてます。 tblA Col1           Col2 1            NA-P1-1 1            NA-P1-2 1            NA-P1-3 1            NA-P1-4 3            NA-P3-1 3            NA-P3-2 3            NA-P3-3 1   この場合、 Select max(Col2) from tblA where Col1 = 1 で現在のCol1=1のMax値(Col2)は NA-P1-4 と取り出せるできるんですが、新規に追加するレコードのCol2の値が NA-P1-5だと取得できる方法はあるでしょうか。 Select Max(col2)+1 ~だと、カラム定義がvarchar2なんで、 当然のようにシステムに怒られました(当然ですが。。) お分かりの方、お願い致します。