带序列和触发器的oracle自动增量无法正常工作

时间:2012-02-24 09:19:54

标签: sql oracle stored-procedures triggers sequence

这是我的问题我有这个代码在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数据库连接。我再添加一个输入,我的数字像20,21,22,23 ...... 我把程序放在我的android上并从不同的设备连接,当我输入一个用户时我有30,31,33,34 ...

为什么会这样?以及如何解决它?

谢谢

编辑:

这是我从数据库中读取数据的过程

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

我在oracle数据库中有点新手。

2 个答案:

答案 0 :(得分:3)

使用NOCACHE指定SEQUENCE将一次停止会话缓存20个数字并提供帮助。

create sequence test_seq
start with 1 
increment by 1
NOCACHE;

然而,如果你希望一个完全连续的序列,这很难实现 - 如果(例如)一个插入回滚,序列中的数字会“丢失”。


根据你的评论,我想知道你是否忘记了COMMIT?

答案 1 :(得分:3)

这不是问题。您可能已在序列创建脚本中指定了cache 10。如果你将其更改为nocache,它将有助于弥补差距,但会以牺牲性能为代价,但它们永远不会完全消失,因为任何回滚都会完成,并且杀死插入等将耗尽值。请参阅this Ask Tom post

在一天结束时,丝毫没关系。如果你依赖一个完整的序列作为你的表的关键,那么你的数据可能有问题而不是序列。