• Oracle序列使用:建立、删除


    在开始讲解Oracle序列使用方法之前,先加一点关于Oracle client sqlplus的使用,就是如果执行多行语句的话一定要加“/”才能表示结束,并执行!本篇文章的主题是通过创建Oracle序列和触发器实现表的主键自增。

    1.首先创建序列,Oracle序列的语法格式为:
    CREATE SEQUENCE 序列名
    [INCREMENT BY n]
    [START WITH n]
    [{MAXVALUE/ MINVALUE n|NOMAXVALUE}]
    [{CYCLE|NOCYCLE}]
    [{CACHE n|NOCACHE}];

    1)INCREMENT BY用于定义序列的步长,如果省略,则默认为1,如果出现负值,则代表Oracle序列的值是按照此步长递减的。

    2)START WITH 定义序列的初始值(即产生的第一个值),默认为1。

    3)MAXVALUE 定义序列生成器能产生的最大值。选项NOMAXVALUE是默认选项,代表没有最大值定义,这时对于递增Oracle序列,系统能够产生的最大值是10的27次方;对于递减序列,最大值是-1。

    4)MINVALUE定义序列生成器能产生的最小值。选项NOMAXVALUE是默认选项,代表没有最小值定义,这时对于递减序列,系统能够产生的最小值是?10的26次方;对于递增序列,最小值是1。

    5)CYCLE 和NOCYCLE 表示当序列生成器的值达到限制值后是否循环。CYCLE代表循环,NOCYCLE代表不循环。如果循环,则当递增序列达到最大值时,循环到最小值;对于递 减序列达到最小值时,循环到最大值。如果不循环,达到限制值后,继续产生新值就会发生错误。

    6)CACHE(缓冲)定义存放序列的内存块的大小,默认为20。NOCACHE表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能。

    2.删除Oracle序列的语法是DROP SEQUENCE 序列名;

    假设有表TEST,其主键为TEST_ID
    1)建立递增序列SEQ_TEST:
    create sequence SEQ_TEST
    increment by 1
    start with 1
    minvalue 1 nomaxvalue
    nocylce

    2)建立触发器,当有数据插入表TEST时,使用Oracle序列为其去的递增的主键值
    create trigger TRG_TEST before insert on TEST
    for each row
    begin
    select SEQ_TEST.nextval into :new.TEST_ID from dual;
    end;

    至此,创建完成!

    当然也可以不使用触发器,而是在插入时在sql语句中调用序列,例如
    insert into TEST values(SEQ_TEST.nextval, ……)

    3、修改序列语法:

    ALTER SEQUENCE 序列名
      [INCREMENT BY n]
      [{MAXVALUE/ MINVALUE n|NOMAXVALUE}]
      [{CYCLE|NOCYCLE}]
      [{CACHE n|NOCACHE}];

    *不能修改序列的初始值

    但是要注意的是:
    - 第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,
    然后返回增加后的值。CURRVAL 总是返回当前sequence的值,但是在第一次NEXTVAL
    初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次sequence的值,
    所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。明白?
    - 如果指定CACHE值,oracle就可以预先在内存里面放置一些sequence,这样存取的快
    些。cache里面的取完后,oracle自动再取一组到cache。 使用cache或许会跳号, 比如
    数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可
    以在create sequence的时候用nocache防止这种情况。

    模版>>

    Oracle创建序列:

    create sequence seq_a 
    minvalue 1000 
    maxvalue 99999999 
    start with 1000 
    increment by 1 
    nocache;  

    查询序列:

    select seq_a.nextval from dual;  

    为每张表生成对应的序列:

    --创建存储过程:

        create or replace procedure p_createseq(tablename in varchar2)   
        is   
        strsql varchar2(500);   
        begin   
        strsql:='create sequence seq_'||tablename||' minvalue 1000 maxvalue 99999999 start with 1000 increment by 1 nocache';   
        execute immediate strsql;   
        end p_createseq;   
        /  

    --Oracle创建序列:

    exec p_createseq('t_power');   
    exec p_createseq('t_roler');   
    exec p_createseq('t_roler_power');   
    exec p_createseq('t_department');   
    exec p_createseq('t_quarters');   
    exec p_createseq('t_quarters_roler');   
    exec p_createseq('t_emp');   
    exec p_createseq('t_require_plan');   
    exec p_createseq('t_require_minutia');   
    exec p_createseq('t_require_audit');   
    exec p_createseq('t_engage');   
    exec p_createseq('t_home');   
    exec p_createseq('t_education');
    ... ...
  • 相关阅读:
    APIO2019游记
    ZJOI2019赛季回顾
    「HNOI 2019」白兔之舞
    LOJ #6539 奇妙数论题
    BZOJ4314 倍数?倍数!
    伯努利数学习笔记&&Luogu P3711 仓鼠的数学题
    BZOJ 5093[Lydsy1711月赛]图的价值 线性做法
    AtCoder Grand Contest 030题解
    Codeforces Round #542 (Div. 1) 题解
    Codeforces Round #541 (Div. 2)题解
  • 原文地址:https://www.cnblogs.com/Lightning-Kid/p/3908300.html
Copyright © 2020-2023  润新知