番号を自動採番しているのですがプロパティがCHARになっています。
番号は1から999999の範囲です。
自動採番の仕方は
SQLで
SELECT NVL(MAX(TO_NUMBER(CODE+1)),0) FROM TABLE WHERE RETU = 1 AND LENGTH(CD_MEMBR) < 6
のような感じでCODEの最大値+1をした値を出しています。
何台かのPCで同時に登録しようとしているのですが番号をかぶらないようにする方法がわかりません。23日にある質問でシーケンスを使う方法とありますが
CREATE SEQUENCE CODE
START WITH 1 INCREMENT BY 1 MAXVALUE 999999 MINVALUE 1
CYCLE
と順序を作成して SELECT CODE.NEXTVAL FROM DUAL
で取得するところまではできました。その後がわかりません。よろしくお願いします。
NVL(MAX(TO_NUMBER(CODE+1)),0)のかわりに、CODE.NEXTVALとする
SELECT CODE.NEXTVAL
FROM TABLE
WHERE RETU = 1 AND LENGTH(CD_MEMBR) < 6
それで自動採番はされてかぶらないのですが
今回新規で作るのではなくてすでに番号の列があり運用されていて番号に欠番があります。
全体の列の数は9145行なのですが 今一番最後の番号は16773番が使われています。
この一番最後の番号に+1して16774は取得ができるのですが
何台かのPCで同時登録の時、自動採番で番号をかぶらない条件が思い浮かばず悩んでいます。
ここは Oracle の掲示板では無く、VB の掲示板ですよ。
> 今一番最後の番号は16773番が使われています。
であれば、
CREATE OR REPLACE SEQUENCE CODE START WITH 16774 〜〜
かな。
> 何台かのPCで同時登録の時、自動採番で番号をかぶらない条件
ですから、同時採番で被らないようにするために、
(MAX ではなく) SEQUENCE を使う、という話ですよね。
番号とシーケンスの値を同じにすることでかぶらないで自動採番できました。
番号はかぶらなくなったのですが番号を取得してからキャンセルして(画面を閉じる等)また自動採番したときに前の番号が取れないのは仕様ですよね?欠番ができてしまうのでどうなのかな、と思いまして。何度も質問すみません。
解決しました。ORACLEの質問をしてしまいすみませんでした。
教えてくださった方々ありがとうございました。
> 仕様ですよね
ですね。すでに欠番がある以上、運用上はそれで問題無い気もします。
> キャンセルして(画面を閉じる等)
画面を開いた時に番号を取得して、最後に書き込むという仕様では無く、
番号無しで画面を開き、書き込む段階で番号を決定するようにすれば
欠番を生じさせずに済むのでは無いでしょうか。
> 前の番号
NEXTVAL した直後にその値を得たいなら、CURRVAL が使えます。
(他人が NEXTVAL した値は取れません)
> 欠番ができてしまうのでどうなのかな
どちらにせよ、削除すれば欠番はできますよね。
ちなみに、
CREATE TABLE TEST ( X NUMBER( 3 ) PRIMARY KEY ) ;
INSERT ALL
INTO TEST VALUES ( 1 )
INTO TEST VALUES ( 2 )
INTO TEST VALUES ( 3 )
INTO TEST VALUES ( 7 )
SELECT * FROM DUAL ;
COMMIT ;
のようなデータ(1, 2, 3, 7) が登録済みのテーブルから、
最も若い欠番値「4」を得るために、
SELECT NVL( MIN( X + 1 ) , 1 ) FROM (
SELECT X , LEAD( X ) OVER( ORDER BY X ) LNO FROM TEST
) WHERE LNNVL( X + 1 = LNO )
という SQL を書く事ができます。
10g 未満のバージョンでは、最後の LNNVL の部分を
WHERE X + 1 <> NVL(LNO, 0) にすれば OK。
# もはや VB ネタじゃない(泣)
ツイート | ![]() |