ORACLE SEQUENCE(队列)用法

来源:互联网 发布:域名备案需要多少钱 编辑:程序博客网 时间:2024/06/10 07:17


PS:当需要产生唯一ID的时候,MSSQL只需将ID设置为int类型,并且设置为自增长就能达到.

     oracle中需要用序列+触发器 才可以达到 MSSQL中的只增长效果.(俩者还是有区别的.oracle中需要用序列类似于建了一张临时表专门用来管理序列,

可以为多张表诸如A,B,C,D,E等多张表的ID都可以用这个公共的序列来做他们的主键,并且表与表的主键也不会重复.)


序列(Sequence)是一种可以被多个用户使用的用于产生一系列唯一数字的数据库对象。序列定义存储在数据字典中,通过提供唯一数值的顺序表来简化程序设计工作,可以使用序列自动产生主键的键值。当一个序列第一次被查询调用时,它将返回一个预定值。在随后的每次查询中,序列将产生一个按指定的增量增长的值。序列可以循环,或者是连续增加的,直到指定的最大值为止。

范例:

CREATE SEQUENCE seqTestINCREMENT BY 1 -- 每次加几个START WITH 1 -- 从1开始计数NOMAXvalue -- 不设置最大值NOCYCLE -- 一直累加,不循环CACHE 10; --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE

案例:

--队列测试CREATE SEQUENCE seqTestINCREMENT BY 1 -- 每次加几个START WITH 1 -- 从1开始计数NOMAXvalue -- 不设置最大值NOCYCLE -- 一直累加,不循环CACHE NOCACHE --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE--nextValselect seqtest.nextVal from dualselect * from seqTestselect seqTest.currval from dual--设置Shenqingdh队列CREATE SEQUENCE seqShenqingdhINCREMENT BY 1 -- 每次加几个START WITH 100000001 -- 从100000001开始计数NOMAXvalue -- 不设置最大值NOCYCLE -- 一直累加,不循环CACHE 10 --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE
--查询 (第一次要先查nextVal 值,否则直接查currval 值会报错)select seqShenqingdh.currval from dualselect seqShenqingdh.nextVal from dual


--得到Sequence值 --定义好sequence后,你就可以用currVal,nextVal取得值。-- CurrVal:返回 sequence的当前值 -- NextVal:增加sequence的值,然后返回 增加后sequence值 --SELECT [定义Sequence名称].CurrVal FROM DUAL; --如得到上边创建Sequence值的语句为:select seqShenqingdh.nextVal from dual
--------------------------------------------------------
NEXTVAL16100000000044

--------------------------------------------------------
NEXTVAL16100000000045

C#后台使用案例:

获取nextVal的值给给实体entity.SHENQINGDH赋值.

#region 获取Shenqingdh队列                        var dv_seq = IBll.EntityHelper.Dal.Query(string.Format("select seqShenqingdh.nextVal from dual"));                        if (dv_seq.Tables[0].Rows.Count > 0)                        {                            entity.SHENQINGDH = dv_seq.Tables[0].Rows[0]["nextVal"].ToString();                        }                        else                        {                            result = -1;                            resultXml = GetErrorStr("获取Shenqingdh队列失败" + BAOJIANCH, result);                            LogUtil.WriteLog("log", "content:" + "失败." + "|msg:" + resultXml + "|原始请求数据:" + inXML, getMaxValueByXml("sType8"));                            return result;                        }                        #endregion


扩展插入

-- Create tablecreate table CXPTEST(  id      VARCHAR2(50),  content VARCHAR2(50),  remarks VARCHAR2(50))tablespace TS_FYBJ  pctfree 10  initrans 1  maxtrans 255  storage  (    initial 64K    next 8K    minextents 1    maxextents unlimited  );


--insert into 表名 (id, name) values ( [定义Sequence名称].Nextval, 'sequence 插入测试');INSERT INTO CXPTEST(ID,CONTENT) VALUES(seqShenqingdh.nextVal,'测试')
select * from CXPTEST

--------------------------------------------------------

   ID       CONTENTREMARKS116100000000046测试216100000000047测试316100000000048测试




参考文献:

[1]http://www.cnblogs.com/hyzhou/archive/2012/04/12/2444158.html

[2]http://bbs.csdn.net/topics/330168032

[3]http://blog.csdn.net/java3344520/article/details/4907591


                                             
1 0