2012-02-24 7 views
2

が動作していない私のproblemIは、Oracleデータベースの自動インクリメントの変数を作成するには、このコードを持っている:オラクルの自動インクリメントはここに正しく

CREATE TABLE Korisnici 
    (
     id_korisnika number PRIMARY KEY, 
     ime_korisnika varchar2(200), 
     prezime_korisnika varchar2(200), 
     broj_telefona varchar2(30), 
     adresa_korisnika varchar2(400) 
    ) 
    /

create sequence test_seq 
start with 1 
increment by 1; 

CREATE OR REPLACE TRIGGER test_trigger 
BEFORE INSERT ON Korisnici FOR EACH ROW 
BEGIN 
    SELECT test_seq.NEXTVAL 
    INTO :NEW.id_korisnika 
    FROM DUAL; 
END; 
/

私はすべてを初めから開始する場合は素晴らしい作品、私は1として番号を持っています2,3,4 .... プログラムを閉じてもう一度開くと、Oracleデータベース接続が再び開始されます。私はもう1つの入力を追加し、私は20,21,22,23のような数字を持っています... 私はアンドロイドにプログラムを入れて、別のデバイスから接続します。私は30,31,33,34 ...

どうしてですか?それを修正する方法は?

はありがとう

EDIT:

ここデータベース

CREATE OR REPLACE PROCEDURE Citanje_korisnika(p_rc OUT SYS_REFCURSOR) 
AS 
BEGIN 
    OPEN p_rc 
    FOR SELECT * 
     FROM Korisnici; 
END; 

からデータを読み込むための私のprocは、私は、Oracleデータベースの初心者のビット思いです。

+0

各トランザクションをコミットすると、シーケンスは連続的に増加しています。何が問題なの? – rics

答えて

2

NOCACHEを指定してSEQUENCEを指定すると、一度に20の数値をキャッシュするセッションが停止し、助けになります。あなたは完全に連続した配列を期待している場合

create sequence test_seq 
start with 1 
increment by 1 
NOCACHE; 

はしかし、これを達成するのは非常に困難である - シーケンスから取られた数字は、挿入はロールバックされた場合(例えば)「失われた」されています。


あなたのコメントに基づいて、COMMITを忘れているのでしょうか?

+0

たとえば、私は私のPHPスクリプトから1行を追加すると、すべて正しかった、次に私はSQLプラスに行き、1つの行を挿入するすべてもうまく行く。しかし、私は私のPHPスクリプトですべてのデータを読みたいときは、私はPHPスクリプトで挿入されたデータを取得する...私はそれをもう少しあなたの答えは、ノーチについて答えます –

+0

何かが間違って見ることができるように私のprocを入れますよ –

3

これは問題ではありません。おそらく、cache 10をシーケンス作成スクリプトに指定しました。これをnocacheに変更すると、ギャップに役立ちますが、パフォーマンスにヒットしますが、ロールバックが完了すると完全に消えず、殺されたインサートなどが値を使い果たします。 this Ask Tom postをご覧ください。

1日の終わりに、それは少しでも重要ではありません。あなたがテーブルのキーとして壊れていないシーケンスに頼っているなら、おそらくシーケンスではなくデータに問題があるでしょう。

+0

@cagcowboyのコメントを書きましたが、もしあなたがそれを知っていれば、それにも答えることができます.. –

+0

@denonth、あなたはあなたのトリガーとあなたのプロシージャをリンクしていないので、procは何も教えてくれません。私は彼の答えに扇子の編集に同意する傾向がある。 – Ben

関連する問題