使用ORACLE的序列

当你想在一张表设置一个column来记录编号或流水号
如:
create or replace table test_sq
(
 id  number(3),
 dd  varchar2(20)
);
/
在第二列里插入系统日期,同时在第一列里自动编号(从1开始,每插入一行记录,id就自动加1)

这个时候,我们就可以用到oracle的sequence了。
以上例为例,我们来创建一个序列newsq,语法如下:
create sequence "newsq" increment by 1 start with 1 minvalue 1 maxvalue 999 cycle nocache order;
说明:
increment by 表示序列的增量,可正可负
start with  表示序列的初始值
minvalue   最小值
maxvalue   最大值
cycle     循环使用,用大最大值再返回
nocache    不使用cache,这样不影响数据库性能,自身处理会慢点,较安全,对         于多个实例使用同一个序列,则需要使用cache
order    顺序使用序列值

要使用sequence,还必须用上oracle的triger(触发器)
通过triger来告诉数据库,在向表test_sq里插入记录时要用序列newsq.语法如下:
create or replace trigger insert_newsq
before insert on test_sq
referencing old as old new as new
for each row   *表明在向test_sq插入每一行之前触发
begin

  select newsq.nextval into :new.id from dual; 
    *读取newsq的下一个值赋给test_sq的新id

  exception
    when others then
      -- consider logging the error and then re-raise
      raise;
end insert_newsq

现在,我们创建的序列就可以工作了!
可以测试下:
insert into test_sq(dd) values(sysdate);

如果,我们希望序列包含更多的信息,比如日期等,以便日后做统计用,可以吗?
当然可以!

我们可以在triger那里打主意:)
比如我们要在序列里加上日期20030225xxx,后面的xxx表示是从序列里的来值。
先要更新表:
alter table test_sq modify (id number(11) )   *扩展列宽
然后修改triger
create or replace trigger insert_newsq
before insert on test_sq
referencing old as old new as new
for each row   begin

  select to_char(sysdate,'yyyymmdd')||lpad(newsq.nextval,3,'0') into :new.id from dual; 
   

  exception
    when others then
      -- consider logging the error and then re-raise
      raise;
end insert_newsq

ok,再插入一个值看看发现序列变漂亮了吧!
<script type="text/javascript">ShowMagicFace();</script>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值