同じ番号ヲ取得しないには

解決


番号初心者  2008-07-25 20:36:25  No: 140138

番号を自動採番しているのですがプロパティが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
で取得するところまではできました。その後がわかりません。よろしくお願いします。


やじゅ  2008-07-25 23:48:58  No: 140139

NVL(MAX(TO_NUMBER(CODE+1)),0)のかわりに、CODE.NEXTVALとする

SELECT CODE.NEXTVAL
FROM TABLE 
WHERE RETU = 1 AND LENGTH(CD_MEMBR) < 6


番号初心者  2008-07-26 00:13:11  No: 140140

それで自動採番はされてかぶらないのですが
今回新規で作るのではなくてすでに番号の列があり運用されていて番号に欠番があります。
全体の列の数は9145行なのですが  今一番最後の番号は16773番が使われています。
この一番最後の番号に+1して16774は取得ができるのですが
何台かのPCで同時登録の時、自動採番で番号をかぶらない条件が思い浮かばず悩んでいます。


魔界の仮面弁士  2008-07-26 00:39:42  No: 140141

ここは Oracle の掲示板では無く、VB の掲示板ですよ。

> 今一番最後の番号は16773番が使われています。
であれば、
  CREATE OR REPLACE SEQUENCE CODE START WITH 16774 〜〜
かな。

> 何台かのPCで同時登録の時、自動採番で番号をかぶらない条件
ですから、同時採番で被らないようにするために、
(MAX ではなく) SEQUENCE を使う、という話ですよね。


番号初心者  2008-07-26 00:55:11  No: 140142

番号とシーケンスの値を同じにすることでかぶらないで自動採番できました。


番号初心者  2008-07-26 00:57:41  No: 140143

番号はかぶらなくなったのですが番号を取得してからキャンセルして(画面を閉じる等)また自動採番したときに前の番号が取れないのは仕様ですよね?欠番ができてしまうのでどうなのかな、と思いまして。何度も質問すみません。


番号初心者  2008-07-26 01:19:03  No: 140144

解決しました。ORACLEの質問をしてしまいすみませんでした。
教えてくださった方々ありがとうございました。


魔界の仮面弁士  2008-07-26 01:22:35  No: 140145

> 仕様ですよね
ですね。すでに欠番がある以上、運用上はそれで問題無い気もします。

> キャンセルして(画面を閉じる等)
画面を開いた時に番号を取得して、最後に書き込むという仕様では無く、
番号無しで画面を開き、書き込む段階で番号を決定するようにすれば
欠番を生じさせずに済むのでは無いでしょうか。

> 前の番号
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 ネタじゃない(泣)


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加